何も移動しないのに、なぜ `std::move` が `std::move` と呼ばれるのでしょうか?

Mary-Kate Olsen
リリース: 2024-11-20 04:40:02
オリジナル
884 人が閲覧しました

Why is `std::move` Called `std::move` if it Doesn't Move Anything?

std::move はなぜ std::move という名前なのでしょうか?

その名前に反して、std::move は物理的に何も移動しません。むしろ、オブジェクトを右辺値参照、より具体的には xvalue にキャストします。関数に move という名前を付ける決定は、騙したり混乱させるためではなく、コードを読みやすくするためでした。

右辺値参照の初期段階では、std::swap 関数はパフォーマンスを最適化する必要がありました。元のメソッドでは明示的な static_cast を使用していました。

std::move を導入することにより、明示的なキャストはコードの意図を強調する糖衣構文に置き換えられ、移動セマンティクスを有効にすることができました。 「右辺値へのキャスト」などの正確な技術的詳細を説明すると、追加の疑問が生じ、要点が曖昧になってしまうでしょう。

std::move の歴史

std:: の歴史move は 2002 年の右辺値参照の提案に遡ります。 move 関数は当初、次の構文糖として導入されました。 static_cast は、当時、右辺値と移動セマンティクスの関係を完全に理解しているプログラマはほとんどいなかったことを理解しています。

C 言語が進化するにつれて、右辺値の概念は、今日私たちが値カテゴリとして知っているものに洗練されました。 。操作をより正確に説明するために、cast_to_xvalue などの別の名前を使用すると、読みやすさが損なわれる可能性があります。

std::move の動作

本質的に、std::move は単純にオブジェクトをキャストします。 xvalueに変換します。このキャストは、簡単に移動可能なオブジェクトには影響しません。また、移動代入演算子を持つオブジェクトの場合、コピー代入演算子の代わりに移動代入演算子が確実に呼び出されます。

生成されたオブジェクト コードに関しては、std:: move は、自明な移動可能なオブジェクトには影響しません。移動代入演算子を含むオブジェクトの場合、オーバーロードの解決が変更される可能性があります。ただし、実行時には std::move は実質的になくなり、影響があるのはコンパイル時だけです。

以上が何も移動しないのに、なぜ `std::move` が `std::move` と呼ばれるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート