ホームページ > バックエンド開発 > C++ > C 関数のオーバーロードで右辺値参照が左辺値のように動作することがあるのはなぜですか?

C 関数のオーバーロードで右辺値参照が左辺値のように動作することがあるのはなぜですか?

Patricia Arquette
リリース: 2024-11-29 22:50:11
オリジナル
317 人が閲覧しました

Why Does an Rvalue Reference Sometimes Act Like an Lvalue in C   Function Overloading?

右辺値参照変数を理解する

C では、右辺値参照は、右辺値 (名前のない値) にのみバインドできる特殊なタイプの参照です。 )。ただし、関数が左辺値参照と右辺値参照の両方のオーバーロードでオーバーロードされると、驚くべき動作が発生します。

混乱: 左辺値と同様に動作する右辺値参照変数

次の関数オーバーロード:

void f(T&&); // Overload #1 (rvalue reference)
void f(T&);  // Overload #2 (lvalue reference)
ログイン後にコピー

別の関数内function:

void g(T&& t) 
{ 
  f(t);  // Calls Overload #2 (lvalue reference)
}
ログイン後にコピー

驚くべき結果は、引数 t が右辺値参照であるにもかかわらず、オーバーロード #2 (左辺値参照) が呼び出されるということです。

理由: 右辺値参照は特殊な型

の左辺値参照は、名前があり、左辺値として使用できるため、左辺値とみなされます。ほとんどの目的に使用できる左辺値。ただし、その型である右辺値参照は、その制限されたバインディング機能を指定します。

右辺値参照オーバーロードを呼び出す方法

右辺値参照オーバーロードを呼び出すには、引数は次のようにする必要があります。 static_cast を使用して明示的に右辺値参照に変換される演算子:

f(static_cast<T&amp;&amp;>(t));
ログイン後にコピー

右辺値参照を管理するその他のルール

  • T&& は、テンプレート コンテキストで転送参照として動作できます。
  • T&&右辺値または右辺値への参照にバインドできます (X const&&).
  • 右辺値参照には、静的バインディング プロパティと動的バインディング プロパティの両方があります。
  • 右辺値参照が一時値に直接バインドされる場合、参照の有効期間の延長が発生し、参照の有効期限が切れるまで有効期間が延長されます。

以上がC 関数のオーバーロードで右辺値参照が左辺値のように動作することがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート