ホームページ >バックエンド開発 >C++ >C で右辺値参照パラメータを左辺値引数にバインドできるのはどのような場合ですか?

C で右辺値参照パラメータを左辺値引数にバインドできるのはどのような場合ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-07 21:48:18883ブラウズ

When Can an Rvalue Reference Parameter Bind to an Lvalue Argument in C  ?

右辺値参照パラメーターが左辺値引数にバインドできる理由

C では、右辺値参照は右辺値にバインドされることが期待されます。ただし、多くのプログラマを驚かせるように、右辺値参照パラメータが左辺値引数と一致する場合があります。

次のコードを考えてみましょう。

void f(T&&); // #1
void f(T&);  // #2

通常、f(T&&) が期待されます。 rvalue を渡すときに呼び出されるオーバーロード、および lvalue の f(T&) オーバーロード。ただし、動作は異なります。

void g(T&& t) 
{ 
  f(t);  // calls #2
}

この例では、t が右辺値であっても f(T&) オーバーロードが呼び出されます。これは、右辺値参照型にもかかわらず、t が左辺値とみなされるために発生します。

理論的根拠:

右辺値は通常、名前のないエンティティ、または名前を失うエンティティです。すぐに名前を付けます。右辺値参照は右辺値にのみバインドできます。ただし、 t には名前があり、その有効期間はすぐには期限切れになりません。

型 T&&:

T&& は右辺値参照の型です。これは右辺値にのみバインドできますが、それ以外の場合は右辺値参照型の左辺値として動作します。その右辺値参照の性質は、構築中および decltype(variable_name) の実行時にのみ重要です。

std::move():

std::move( ) を実行して右辺値参照を返します。 static_cast(t).

関連ルール:

  • 関数から名前付き値を返すときに、右辺値参照パラメーターへの暗黙的な移動が発生します。 、または値に名前がない場合。
  • rvalue 参照と const& のみが可能です。右辺値にバインドします。
  • 右辺値参照と const& は、コンストラクターの外部の参照に直接バインドされると有効期間が延長されます。
  • 参照の折りたたみは、T が X& 型である場合、T&& を X& または X const& に変換します。 X const&.
  • 型推論コンテキストでは、T&& は T を X、X&、X として推論します。 const&、または引数の型に基づく X const&&。

以上がC で右辺値参照パラメータを左辺値引数にバインドできるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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