std::move と std::forward: 右辺値処理の違いを明らかにする
C における move セマンティクスの出現により、右辺値参照の操作と転送に重要な 2 つの関数、std::move と std::forward。どちらもオブジェクトを参照型にキャストしますが、特定の動作と使用例が異なります。
std::move: 右辺値参照へのキャスト
std:: move はオブジェクトを取得し、それを右辺値参照に変換します。右辺値参照は通常、参照されるオブジェクトが一時的なものとみなされ、使用後に無効になる可能性があることを意味するため、これは重要です。基本的に、std::move を使用すると、オブジェクトを現在の場所から「移動」するつもりであることを通知でき、オブジェクトが占有している基礎となるメモリを解放できる可能性があります。
std::forward: Perfect Forwarding一方、右辺値参照
std::forward は特定の目的を果たします。関数は、引数の参照型を呼び出し元に転送します。これにより、「完全転送」が可能になります。これは、関数に渡された右辺値引数が、その関数内で右辺値として扱われ続けることを意味します。これは、これらの一時値の意図されたセマンティクスを保持するために重要です。
いつどちらを使用するか
std::move と std::forward のどちらを使用するかはコンテキストによって決まります。および望ましい結果:
違いを説明するために、次の例を考えてみましょう。
void overload(int const& arg) { std::cout << "by lvalue\n"; } void overload(int&& arg) { std::cout << "by rvalue\n"; } template<typename t> void forwarding(t&& arg) { std::cout << "via std::forward: "; overload(std::forward<t>(arg)); std::cout << "via std::move: "; overload(std::move(arg)); std::cout << "by simple passing: "; overload(arg); }
右辺値を指定して forwarding(5) を呼び出すと、出力は次のようになります。
via std::forward: by rvalue via std::move: by rvalue by simple passing: by rvalue
これは、std::forward が引数の右辺値の性質を保持するのに対し、std::move は引数を右辺値として扱うことを示しています。
対照的に、左辺値 (x = 5) を指定して forwarding(x) を呼び出すと次が生成されます。
via std::forward: by lvalue via std::move: by rvalue by simple passing: by lvalue
ここでは、std::forward と std::move の両方が生成されます。左辺値を右辺値参照にキャストし、それぞれの異なる役割を強調します。
以上がstd::move と std::forward: 右辺値の処理にどちらを使用する必要があるか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。