ホームページ > バックエンド開発 > C++ > 一時 C オブジェクトを非 Const 参照に渡せないのはなぜですか?

一時 C オブジェクトを非 Const 参照に渡せないのはなぜですか?

Linda Hamilton
リリース: 2024-11-29 21:01:13
オリジナル
678 人が閲覧しました

Why Can't I Pass a Temporary C   Object to a Non-Const Reference?

一時オブジェクトを参照として渡す

C では、一時オブジェクトを参照として使用すると、予期しない動作が発生する可能性があります。これを回避するために、コンパイラーは一時オブジェクトを参照パラメーターに渡す際に制限を適用します。

最初のクエリで提供されたコードをコンパイルするとき:

class Foo { public: Foo(int x) {}; };
void ProcessFoo(Foo& foo) {};
int main() { ProcessFoo(Foo(42)); return 0; }
ログイン後にコピー

一時的な Foo(42) が原因でエラーが発生します。 ) オブジェクトが非 const 参照パラメータ (ProcessFoo(Foo& foo)) に渡されています。設計上、C ではこの方法を許可していません。

回避策:

提案された回避策により、次の方法で問題が軽減されます。

  • 一時変数の作成: 一時オブジェクトを変数に代入し、次に、それを参照として渡します:

    Foo foo42(42);
    ProcessFoo(foo42);
    ログイン後にコピー
  • Const 参照の使用: const 参照を取得するように ProcessFoo を変更します (ProcessFoo(const Foo& foo))。一時的な受け入れを許可しますオブジェクト:

    void ProcessFoo(const Foo& foo) {};
    ProcessFoo(Foo(42));
    ログイン後にコピー
  • 値による受け渡し: ProcessFoo が値によってオブジェクトを受け取ることを許可します (ProcessFoo(Foo foo))。これにより、参照が回避されます。制限:

    void ProcessFoo(Foo foo) {};
    ProcessFoo(Foo(42));
    ログイン後にコピー

コンパイラーの不一致:

Microsoft Visual Studio と GNU C (g ) の動作の違いは、おそらく次の点が異なるためです。デフォルト設定。デフォルトでは、g は C 標準へのより厳密な準拠を強制しますが、Visual Studio では特定の逸脱が許容される場合があります。これにより、一方のコンパイラではエラーが生成され、もう一方のコンパイラではエラーが生成されない可能性があります。

以上が一時 C オブジェクトを非 Const 参照に渡せないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート