C の Const オブジェクトから移動できますか?

Patricia Arquette
リリース: 2024-11-18 09:49:02
オリジナル
643 人が閲覧しました

Can You Move From a Const Object in C  ?

const オブジェクトの std::move を理解する: パフォーマンスの落とし穴を明らかにする

C では、オブジェクトの所有権を譲渡するために std::move 関数が使用されます。ただし、よくある疑問が生じます。なぜ const オブジェクトに対して std::move を呼び出すことができるのでしょうか?これは直感に反し、潜在的に危険ではないでしょうか?

その秘訣は、std::move(const_object) が実際の移動を実行しないという事実にあります。代わりに、コンパイラに移動を試みるよう指示します。クラスに右辺値への const 参照 (移動コンストラクター) を受け入れるコンストラクターがない場合、コンパイラーはデフォルトで暗黙的なコピー コンストラクターを使用します。

次の例を考えてみましょう:

struct Cat {
   Cat(){}
   Cat(const Cat&amp;) {std::cout << "COPY";}
   Cat(Cat&amp;&amp;) {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 オブジェクト上で動作しないように制限するのは論理的であるように思えるかもしれませんが、実際はそうではありません。以下の理由により、これは単純な解決策ではありません:

  • 非定数オブジェクトには移動コンストラクターが不足している可能性が依然としてあるため、意図しないコピーのすべてのケースを防ぐことはできません。
  • これは、フォールバック コピー コンストラクターを意図的に使用する汎用テンプレート コードを妨げます。
  • const オブジェクトからの移動コンストラクターが意図的に必要な場合を制限します。

以上がC の Const オブジェクトから移動できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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