C で一時オブジェクトを参照として渡す
C では、次のような最小限のコード スニペットが Linux および Mac でコンパイル エラーを引き起こす可能性があります。プラットフォーム:
class Foo { public: Foo(int x) {} }; void ProcessFoo(Foo& foo) { } int main() { ProcessFoo(Foo(42)); return 0; }
コンパイルエラー:
上記のコードをコンパイルすると次のエラーが発生します:
newfile.cpp: In function ‘int main()’: newfile.cpp:23:23: error: invalid initialization of non-const reference of type ‘Foo&’ from an rvalue of type ‘Foo’ ProcessFoo(Foo(42)); ^ newfile.cpp:14:6: note: in passing argument 1 of ‘void ProcessFoo(Foo&)’ void ProcessFoo(Foo& foo)
エラーが発生する理由:
仕様により、 C では、一時オブジェクトを非 const 参照パラメータに渡すことを禁止しています。この制限は、潜在的な誤解や間違いを防ぐことを目的としています。関数が非 const 参照パラメータを宣言すると、オブジェクトを変更して呼び出し元に返すという意図を示します。このようなパラメータに一時パラメータを渡すことは、関数が戻ると破棄されるため非論理的です。
回避策:
このコンパイル エラーを解決するには、次の回避策を検討してください。 :
Foo foo42(42); ProcessFoo(foo42);
void ProcessFoo(const Foo& foo)
void ProcessFoo(Foo foo)
MSVC がそれを許可する理由:
Microsoft がなぜ許可するのかは不明ですVisual Studio (MSVC) ではこのコードをコンパイルできますが、g ではコンパイルできません。この点に関して、MSVC は C 標準に対して異なる解釈を持っている可能性があります。一般に、さまざまなコンパイラ間で一貫した動作を保証するために、標準に従うことをお勧めします。
以上がC で一時オブジェクトを非 Const 参照に渡すと失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。