std::move はなぜ std::move という名前なのでしょうか?
その名前にもかかわらず、std::move(x) は物理的には何かを動かす。代わりに、これは単に rvalue (特に xvalue として知られる) にキャストされます。この用語は、既知の固定値を持つ式を指す prvalue とは対照的です。
std::move を使用したこの命名規則の目的は、誤解を招くことではなく、むしろコードの可読性を高めることでした。
元々、左辺値を右辺値にキャストするには、static_cast
template <class T> void swap(T& a, T& b) { T tmp(static_cast<T&&>(a)); a = static_cast<T&&>(b); b = static_cast<T&&>(tmp); }
static_cast を std::move に置き換えることにより、コードがより直感的になり、値を移動するという関数の意図が伝わります。コピーするのではなく:
template <class T> void swap(T& a, T& b) { T tmp(std::move(a)); a = std::move(b); b = std::move(tmp); }
std::move を使用すると、プログラマは、右辺値と移動セマンティクスの複雑な詳細を完全には理解していなくても、値が移動されていることを明確に確認できます。
さらに、プログラマは、必要に応じて、値を右辺値にキャストする独自の関数またはマクロを自由に定義できます。たとえば、次のコード スニペットは、set_value_category_to_xvalue:
template <class T> inline constexpr auto& set_value_category_to_xvalue(T&& t) noexcept { return static_cast<std::remove_reference_t<T>&>(t); }
という名前を使用して std::move の機能を実装します。最終的に、std::move 用に生成されたオブジェクト コードには実際の動きは含まれませんが、コンパイル時に重要な役割を果たします。これにより、呼び出される関数のオーバーロードが変更され、クラスで定義されたより効率的な移動代入演算子の呼び出しにつながる可能性があります。
以上が実際には何も移動しないのに、なぜ std::move が std::move と呼ばれるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。