一時オブジェクトを参照として渡す
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 サイトの他の関連記事を参照してください。