std::move と std::forward: 右辺値処理の違いを明らかにする
C での移動セマンティクスの出現により、右辺値参照の操作と転送に重要な 2 つの関数、std::move と std::forward。どちらもオブジェクトを参照型にキャストしますが、特定の動作と使用例が異なります。
std::move: 右辺値参照へのキャスト
std:: move はオブジェクトを取得し、それを右辺値参照に変換します。右辺値参照は通常、参照されるオブジェクトが一時的であり、使用後に無効になる可能性があるとみなされる可能性があることを意味するため、これは重要です。基本的に、std::move を使用すると、オブジェクトを現在の場所から「移動」するつもりであることを通知でき、オブジェクトが占有している基礎となるメモリを解放できる可能性があります。
std::forward: Perfect Forwarding一方、Rvalue References
std::forward は特定の目的を果たします。関数が参照型を転送することを保証します。呼び出し側への引数。これにより、「完全転送」が可能になります。これは、関数に渡された右辺値引数が、その関数内で右辺値として扱われ続けることを意味します。これは、これらの一時値の意図されたセマンティクスを保持するために重要です。
どちらを使用するか
std::move と std::forward のどちらを使用するかはコンテキストによって異なります。および望ましい結果:
違いを説明するには、次のことを考えてください。例:
void overload(int const& arg) { std::cout void forwarding(t&& arg) { std::cout (arg)); std::cout右辺値を指定して 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 の両方が左辺値を右辺値参照にキャストし、それぞれの異なる役割を強調しています。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3