C 11 では、移動セマンティクスをサポートするために std::move 関数が導入されました。これにより、疑問が生じました。なぜ std::move を定数オブジェクトで使用できるのですか?
定数オブジェクトを移動しようとすると、それを変更しようとしているように見え、意味がありません。ただし、 std::move は賢明なことに、実際には何も移動しません。代わりに、オブジェクトの移動を試みるようコンパイラに指示します。
オブジェクトのクラスに移動コンストラクターがある場合、移動は期待どおりに行われます。しかし、クラスがそうでない場合、コンパイラは代わりにコピー コンストラクターを使用し、定数オブジェクトが安全にコピーされることを保証します。
例:
struct Cat { Cat() {} }; const Cat cat; Cat cat2 = std::move(cat);
この場合、std ::move はコピー コンストラクターにフォールバックし、std::cout が追加された場合は「MOVE」の代わりに「COPY」を出力します。 constructors.
定数オブジェクトに対する std::move の動作はトラップではなく機能です。これにより、プログラムの安定性を損なうことなく、効率的な移動の試行が可能になります。さらに、すべてのコードが移動セマンティクスに依存しているわけではないため、 std::move が定数オブジェクトで動作できるようにすることで柔軟性が得られます。
以上がC の定数オブジェクトに対して「std::move」が機能するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。