C では、オブジェクトの所有権を譲渡するために std::move 関数が使用されます。ただし、よくある疑問が生じます。なぜ const オブジェクトに対して std::move を呼び出すことができるのでしょうか?これは直感に反し、潜在的に危険ではないでしょうか?
その秘訣は、std::move(const_object) が実際の移動を実行しないという事実にあります。代わりに、コンパイラに移動を試みるよう指示します。クラスに右辺値への 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); // prints "COPY" }
ご覧のとおり、cat は const オブジェクトですが、コンパイラーは cat2 をコピーとして安全に構築します。これは、この例では const オブジェクトに使用できる move コンストラクターがないためです。
Scott Meyers が「Effective Modern C」で強調した潜在的な落とし穴は、安定性の問題ではなくパフォーマンスの問題です。基本的に、移動コンストラクターが利用できない場合に const オブジェクトから移動しようとすると、コピーの効率が低下します。
std::move が const オブジェクト上で動作しないように制限するのは論理的であるように思えるかもしれませんが、実際はそうではありません。以下の理由により、これは単純な解決策ではありません:
以上がC の Const オブジェクトから移動できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。