std::forward とは何ですか?また、C の左辺値および右辺値参照の完全な転送をどのように保証しますか?

Barbara Streisand
リリース: 2024-11-19 05:27:03
オリジナル
128 人が閲覧しました

What is std::forward and how does it ensure perfect forwarding for lvalue and rvalue references in C  ?

std::forward: 左辺値および右辺値参照の完全転送

std::forward について

std::forward は、次のことを可能にする C 11 ユーティリティ関数です。完全転送。右辺値参照は右辺値参照として保持され、左辺値参照は左辺値参照として保持されます。これは、渡された引数の元の性質を維持することが重要なテンプレート プログラミングで特に役立ちます。

std::forward のメカニズム

std:: :forward は本質的に static_cast です。誤解を招く可能性があります。 std::forward は実際には型を変換しません。むしろ、転送されるタイプに基づいて適切なアクションを決定するテーブルによって定義されます。基礎となるメカニズムの内訳は次のとおりです。

  • 左辺値参照 (T&) の場合: std::forward は単に引数への参照を返します。
  • 右辺値参照 (T&&) の場合: std::forward は右辺値参照を返します。 argument.
  • ポインター型 (T* または T*&) の場合: std::forward は引数へのポインターを返します。ポインターのコピーは作成されません。
  • 自動参照 (auto& または auto&&) の場合: std::forward は、引数の型に応じて左辺値または右辺値参照として引数を転送します。引数が渡されます。

完璧です転送

テンプレート プログラミングのコンテキストでは、ジェネリック型を受け入れてそれを別の関数に転送するテンプレート関数がある場合、std::forward が重要になります。目的は、転送された引数が元の引数と同じ方法で扱われるようにすることです。

T&& 型の引数 t を関数セットに転送するテンプレート関数 PerfectSet の例を考えてみましょう。 PerfectSet の呼び出し方法に応じて、 t は左辺値参照または右辺値参照のいずれかになります。望ましい動作は、set がそれに応じて t を扱うことです。

std::forward がないと、コンパイラーは t が左辺値参照によって渡されると想定する必要があり、データのコピーが発生する可能性があります。ただし、 std::forward を使用することで、 t:

template<class T>
void perfectSet(T&& t) {
    set(std::forward<T>(t));
}
ログイン後にコピー

の元の性質を保持するようにコンパイラに指示します。t が左辺値参照の場合、std::forward は左辺値参照を返し、set は左辺値参照を返します。その左辺値参照オーバーロードを実行し、データのコピーを引き起こします。ただし、 t が右辺値参照の場合、 std::forward は右辺値参照を返し、 set はその右辺値参照のオーバーロードを実行し、結果として移動操作が行われます。

左辺値/右辺値の混乱を解決する

thing&& と thing& を渡すときの std::forward の動作の明らかな矛盾は、一見すると混乱を招くように見えるかもしれません。ただし、これは、C では左辺値参照と右辺値参照が別個のエンティティであるという事実に由来しています。

  • 左辺値参照 (T&): 既存のオブジェクトを参照します。
  • 右辺値参照 (T&&): によって作成された一時オブジェクトを参照します。 Expression.

元の性質を保持するには、テンプレート関数と受信関数の両方が右辺値を受け入れるときに右辺値参照を使用する必要があります。これはまさに std::forward が保証するものであり、完全な転送と最適なパフォーマンスを保証します。

以上がstd::forward とは何ですか?また、C の左辺値および右辺値参照の完全な転送をどのように保証しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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