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

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

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-05 09:07:11366ブラウズ

Why Does Passing a Temporary Object to a Non-Const Reference Fail in C  ?

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);
  • Const 参照を使用します: const 参照パラメータ:
void ProcessFoo(const Foo& foo)
  • 渡します値: 関数がオブジェクトを値パラメータとして受け取ることを許可します:
void ProcessFoo(Foo foo)

MSVC がそれを許可する理由:

Microsoft がなぜ許可するのかは不明ですVisual Studio (MSVC) ではこのコードをコンパイルできますが、g ではコンパイルできません。この点に関して、MSVC は C 標準に対して異なる解釈を持っている可能性があります。一般に、さまざまなコンパイラ間で一貫した動作を保証するために、標準に従うことをお勧めします。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。