C 11 では、以下のコード スニペットが有効です。
struct Cat { Cat(){} }; const Cat cat; std::move(cat);
This const オブジェクトの移動はその状態の変更を意味するため、動作は直観に反しているように見えるかもしれません。ただし、std::move は実際には移動を実行しないことを理解することが重要です。
const オブジェクトに対して std::move を呼び出すと、コンパイラは単にオブジェクトを移動しようとします。クラスに const lvalue 参照を受け入れるコンストラクターがない場合は、代わりに暗黙的なコピー コンストラクターを使用して新しいオブジェクトを作成します。これにより、const オブジェクトの状態が変更されないことが保証されます。
これを実証するには、次のコードを考えてみましょう。
struct Cat { Cat(){} Cat(const Cat&) {std::cout << "COPY";} Cat(Cat&&) {std::cout << "MOVE";} }; int main() { const Cat cat; Cat cat2 = std::move(cat); }
このコードを実行すると、代わりにコピー コンストラクターが使用されたことを示す「COPY」が出力されます。移動コンストラクターの。これにより、std::move が const オブジェクトを変更しないことが確認されます。
const オブジェクトの移動は本質的に間違っているわけではありませんが、オブジェクトが変更されている場合、パフォーマンスの問題が発生する可能性があります。移動コンストラクターがあります。このような場合、不必要にコピーが作成されてしまいます。さらに、オブジェクトの移動に関連する問題のデバッグがより困難になる可能性があります。
std::move は、オブジェクトを移動する試みとして実装されているため、const オブジェクトで使用できます。実際の動きではなく。この動作は const オブジェクトの規約に違反せず、コード設計の柔軟性を高めることができます。ただし、この方法を実行すると、潜在的なパフォーマンスへの影響やデバッグの問題が発生する可能性があることに注意することが重要です。
以上がC の `std::move` が `const` オブジェクトで機能するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。