定数オブジェクトで std::Move を使用できる理由
一般に、定数オブジェクトに対して std::move を呼び出すことは非論理的であるように思われます。オブジェクトを移動または変更することが期待されます。ただし、C 11 では、定数オブジェクトに対する std::move の使用が許可されています。
詳しく説明すると、std::move(cat) はオブジェクトが実際に移動されることを意味しません。代わりに、コンパイラに移動を試みるよう指示します。クラスが右辺値への const 参照を受け入れるコンストラクター (例: const Cat&&) を定義していない場合、コンパイラーは左辺値コピー コンストラクターへの暗黙的な 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); }
std::move が使用されていても、「COPY」オブジェクトが移動されたのではなくコピーされたことを示すメッセージが出力されます。
この動作は安全メカニズムとして機能します。コピー コンストラクターが無効になっている場合、コンパイラーは開発者にエラー メッセージを表示します。
さらに、Scott Meyers の著書「Effective Modern C」で言及されているバグは、安定性の問題ではなく、パフォーマンスの問題です。この問題は、移動が意図されているときに暗黙的なコピーが実行されると発生し、実行が遅くなります。さらに、このようなバグは、move コンストラクターのない非 const オブジェクトでも発生する可能性があります。
最終的には、std::move を定数オブジェクトで操作できるようにすることで柔軟性が得られます。開発者は、必要に応じて const rvalue 参照からオブジェクトを明示的に構築する機能を保持します。
以上がC の定数オブジェクトで `std::move` を使用できるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。