エラー: 一時オブジェクトを参照として渡す
C では、一時オブジェクトを非 const 参照として渡そうとすると、コンパイル エラーが発生する場合があります。これは、関数が参照パラメータを予期しており、一時オブジェクトを使用して呼び出された場合に発生します。
たとえば、次のコードを考えてみましょう。
class Foo { public: Foo(int x) {}; }; void ProcessFoo(Foo& foo) { } int main() { ProcessFoo(Foo(42)); return 0; }
このコードは、次のような一部のコンパイラで正常にコンパイルされます。 Visual Studio では動作しますが、GCC などの他の動作ではエラーが発生して失敗します。通常、エラー メッセージは、右辺値型からの非 const 参照パラメータの無効な初期化を示します。
回避策
この問題を解決するには、次の 3 つの一般的な回避策があります。
呼び出し用の一時変数を作成します。 ProcessFoo:
Foo foo42(42); ProcessFoo(foo42);
ProcessFoo に const 参照を取得させる:
void ProcessFoo(const Foo& foo) { }
ProcessFoo が Foo を受信できるようにするvalue:
void ProcessFoo(Foo foo) { }
コンパイル エラーの理由
C では、無意味な操作を防ぐために、一時オブジェクトを非 const 参照に渡すことを禁止しています。非 const 参照を受け取る関数は、パラメーターを変更して呼び出し元に返すことを想定しています。一時オブジェクトを渡すと、変更したり返したりできないため、この目的が果たせません。
互換性の違い
元のコードが Visual Studio ではコンパイルされるが、GCC ではコンパイルされない理由は次のとおりです。おそらくコンパイラ設定の違いが原因と考えられます。 Visual Studio では、最適化または下位互換性のために、一時変数を非 const 参照に渡すことができる場合があります。ただし、最新の C コンパイラは、GCC で実装されているように、言語セマンティクスを厳密に適用することを好みます。
以上がC で一時オブジェクトを非 Const 参照として渡すとコンパイル エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。