std::forward: 左辺値および右辺値参照の完全転送
std::forward について
std::forward は、次のことを可能にする C 11 ユーティリティ関数です。完全転送。右辺値参照は右辺値参照として保持され、左辺値参照は左辺値参照として保持されます。これは、渡された引数の元の性質を維持することが重要なテンプレート プログラミングで特に役立ちます。
std::forward のメカニズム
std:: :forward は本質的に static_cast
完璧です転送
テンプレート プログラミングのコンテキストでは、ジェネリック型を受け入れてそれを別の関数に転送するテンプレート関数がある場合、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 では左辺値参照と右辺値参照が別個のエンティティであるという事実に由来しています。
元の性質を保持するには、テンプレート関数と受信関数の両方が右辺値を受け入れるときに右辺値参照を使用する必要があります。これはまさに std::forward が保証するものであり、完全な転送と最適なパフォーマンスを保証します。
以上がstd::forward とは何ですか?また、C の左辺値および右辺値参照の完全な転送をどのように保証しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。