web-dev-qa-db-ja.com

デフォルトのMoveコンストラクターはnoexceptとして定義されていますか?

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

暗黙的に宣言された移動コンストラクター

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

61
bjackfly

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

継承コンストラクター(12.9)および暗黙的に宣言された特別なメンバー関数(12節)にはexception-specificationがあります。 fが継承コンストラクターまたは暗黙的に宣言されたデフォルトコンストラクターである場合、コンストラクターのコピー、コンストラクターの移動、デストラクター、代入演算子のコピー、または代入演算子の移動、その暗黙的- exception-specification type-id Tを指定するのは、Tが直接呼び出される関数のexception-specificationで許可されている場合のみfの暗黙的な定義。 fは、それが直接呼び出す関数がすべての例外を許可する場合、すべての例外を許可し、fにはexception-specificationnoexcept(true)があり、すべての関数が直接呼び出す場合例外を許可しません。

基本的に、それはあなたが思うことを行い、暗黙的に宣言された移動コンストラクターは、可能な限りnoexceptです。

68
Kerrek SB