なぜ右辺値参照変数は右辺値ではないのでしょうか?
2 つのオーバーロード関数 f:
void f(T&&); // Overload #1 void f(T&); // Overload #2
内について考えてみましょう関数g:
void g(T&& t) { f(t); // Calls Overload #2 }
驚くべきことに、最初のオーバーロードに右辺値参照署名 (T&&) があるにもかかわらず、t が左辺値とみなされるため、オーバーロード #2 が呼び出されます。
右辺値参照署名が右辺値を渡す呼び出しと一致しません?
C ルールについて右辺値
右辺値は通常、名前のない変数であり、まもなく名前が失われます。 T&& t は識別子 t を持っているため、左辺値です。右辺値は有効期間が短く、後で参照することは不可能であるため、これは理にかなっています。
ただし、T&& は型右辺値参照です。静的キャストを伴わない右辺値のみにバインドできますが、それでも型右辺値参照の左辺値です。その右辺値参照の性質は、その初期化と decltype の使用中にのみ問題になります。それ以外の場合は、参照型の左辺値として機能します。
静的キャストおよび参照拡張
std::move(t) は、静的キャストを実行して右辺値参照を返します。上に。これにより、一時値がコンストラクターの外部の参照にバインドされている場合、参照の有効期間を延長できます。
C 標準では、これらのシナリオを処理するための明示的なルールが定義されています。右辺値参照と const 参照は右辺値にバインドできます。暗黙的な移動は、関数から名前付きの値を返す場合、値に名前がない場合、または関数が明示的に右辺値参照を返す場合に発生します。
さらに、T&& は必ずしも右辺値参照であるとは限りません。 T が X& の場合または X const&、参照の折りたたみは T&& を変換します。 X& へまたは X const&。最後に、T&& は、引数の型に応じて、型推定の「転送参照」として機能します。
以上が右辺値参照変数が右辺値参照関数の署名と一致しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。