1. ホーム
  2. c++

[解決済み] デフォルトのMoveコンストラクタはnoexceptで定義されていますか?

2023-07-24 12:59:13

質問

ベクターは再割り当ての際に要素を移動するかコピーするかを決定する前に、移動コンストラクタがnoexceptとしてラベル付けされているかどうかを確認するようです。デフォルトのmoveコンストラクタはnoexceptとして定義されているのでしょうか?以下のようなドキュメントを見ましたが、これについては明記されていませんでした。 http://en.cppreference.com/w/cpp/language/move_constructor

暗黙のうちに宣言された移動コンストラクタ

クラス型(構造体、クラス、ユニオン)にユーザ定義の移動コンストラクタがない場合 のコンストラクタが提供されていない場合(構造体、クラス、ユニオン)。 ユーザー定義のコピー コンストラクタがなく、次のすべてが当てはまる場合。 ユーザー定義されたコピー コンストラクタがない。 ユーザー定義されたコピー代入演算子がない。 ユーザー定義された移動代入演算子がない。 ユーザが宣言したデストラクタがない。 暗黙的に宣言された移動コンストラクタが削除されたと定義されていない。 次のセクションで説明する条件により、削除されたと定義されていない。 この場合、コンパイラは移動コンストラクタをクラスのインライン public メンバとして宣言します。 T::T(T&&) というシグネチャを持つクラスのインライン public メンバとして宣言します。 例えば T::T(const T&&) と T::T(T&&) のように、クラスは複数の移動コンストラクタを持つことができます。 ユーザ定義の移動コンストラクタが存在する場合でも、ユーザは暗黙のうちに 暗黙のうちに宣言された移動コンストラクタを強制的に生成することができます。 キーワード default を使用して、暗黙的に宣言された移動コンストラクタを強制的に生成することができます。

どのように解決するのですか?

15.4/14(例外仕様)が答えだと思います。

継承するコンストラクタ(12.9)と暗黙的に宣言された特殊メンバ関数(第12項)には 例外指定 . もし f が継承するコンストラクタ、または暗黙のうちに宣言されたデフォルトコンストラクタである場合、コンストラクタをコピーしてください。 移動コンストラクタ デストラクタ、コピー代入演算子、移動代入演算子、その暗黙の 例外指定 はタイプ ID を指定します。 T もし T が許されるのは 例外指定 によって直接呼び出される関数の f の暗黙の定義によって直接呼び出される関数の f は、それが直接呼び出す関数が全ての例外を許可している場合、全ての例外を許可します。 f 例外指定 noexcept(true) は、それが直接呼び出すすべての関数が例外を許さない場合。

基本的にはDoes What You Thinkで、暗黙のうちに宣言された移動コンストラクタは noexcept であることが可能です。