ホームページ  >  記事  >  バックエンド開発  >  オブジェクトを別のオブジェクトでインスタンス化するときに C 11 の move コンストラクターが呼び出されないのはなぜですか?

オブジェクトを別のオブジェクトでインスタンス化するときに C 11 の move コンストラクターが呼び出されないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-05 08:20:02649ブラウズ

Why isn't the C  11 move constructor called when instantiating an object with another object?

C 11 移動コンストラクターは呼び出されません。デフォルトのコンストラクターが優先されます

質問:

C 内11、別のオブジェクトを介してオブジェクトをインスタンス化するときに、移動コンストラクターが呼び出されるはずのときに呼び出されないのはなぜですか?

回答:

インスタンス化の際、コンパイラは時折、コピー省略として知られる手法を適用します。コピー省略を使用すると、コピーまたは移動のコンストラクター/デストラクターのペアをバイパスして、一時オブジェクトをコピーまたは移動先のターゲットに直接構築できます。

標準では、次の状況でコピー省略が許可されます。

  • Return ステートメント: 関数の戻り値の型と同じ cv 非修飾型を持つ不揮発性自動オブジェクトは、戻り値に直接構築できます。
  • Throw 式: 有効範囲が最も内側の try ブロックを超えない不揮発性自動オブジェクトは、例外オブジェクトに直接構築できます。
  • 一時オブジェクト:参照にバインドされていないものは、同じ cv 非修飾型のオブジェクトに直接構築できます。
  • 例外ハンドラー: 例外ハンドラーの例外宣言は、例外のエイリアスとして扱うことができます。

指定された例では、X("test") で z をインスタンス化すると、バインドされていない一時オブジェクトと見なされるため、コピー省略が発生します。参考に。その結果、これは、移動コンストラクターをバイパスし、代わりにデフォルトのコンストラクターを使用して z に直接構築されます。

明示的に move(X("test")) を呼び出すと、コピーの省略が防止され、移動コンストラクターの使用が強制されます。 、変更された出力に見られるように。

以上がオブジェクトを別のオブジェクトでインスタンス化するときに C 11 の move コンストラクターが呼び出されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。