std::forward を理解する: 左辺値参照と右辺値参照を渡す際の役割
std::forward は、C の完璧なツールです。引数を転送し、左辺値参照か右辺値参照かに関係なく最適なコード動作を保証します。
左辺値と右辺値の直観
「名前があれば左辺値である」という誤解は誤解を招く可能性があります。一般に、変数は左辺値を保持しますが、この区別は関係するコンテキストと操作に関するものです。
完全転送の必要性
ベクトル v を格納する関数セットを考えてみましょう。そのデータ構造 _v。安全なアプローチは、セット内の v への参照を取得することですが、以下の例のように、v が右辺値である場合、不必要なコピーが作成される可能性があります。
set(makeAndFillVector()); // Copies `makeAndFillVector()`'s result into `_v`
右辺値を保持するには完全転送が必要になります。 v の性質を考慮し、不必要なコピーを避けます。
std::forward の役割
std::forward は、渡された参照型に基づいて特定の関数オーバーロードを呼び出すことにより、引数を完美转発行する上で重要な役割を果たします。例:
template<class T> void perfectSet(T &&t) { set(std::forward<T>(t)); }
perfectSet 内で std::forward
動作を理解する
デモンストレーションするstd::forward が引数の右辺値性をどのように保持するかについては、次のコードを検討してください:
void perfectSet(T &&t) { set(t); // Preserves `t` as an lvalue set(t); // `t` remains unchanged }
次と比較してください:
void perfectSet(T &&t) { set(std::forward<T>(t)); // Preserves `t` as an rvalue set(t); // `t` is now empty due to move semantics }
std::forward がないと、コンパイラは次のように仮定します。 t が再度アクセスされる可能性があるため、それを左辺値として保存することを選択します。ただし、 std::forward を使用すると、コンパイラが t を右辺値として正しく処理できるため、その内容が移動されます。
以上がstd::forward はどのようにして完全転送を可能にし、引数の右辺値性を保持するのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。