2016-03-22 7 views
11

だから、私の質問は簡単です:デフォルトのコンストラクタ/代入はnoexceptまたはconstexprに邪魔されますか?

noexceptまたはconstexpr(またはあなたがの事でし他のもの)として不履行クラスのコンストラクタを指定することで任意のポイントはありますか?

2つは同じように動作しますか?

クラスがPODであるかどうかによって異なりますか? たとえば、上記の例では両方とも同じように動作しますが、たとえば私がプライベートメンバーstd::vector<int> v = { 1, 2, 3, 4 };でクラス内の割り当てを使用する場合、foo() = default;はデフォルトでnoexceptでなくconstexprではありません。

foo() = default;を書くことによって、コンパイラは最高のバージョンを選択します:可能であればnoexcept、可能であればconstexprなどですか?

私は質問がはっきりしていることを願っています!

答えて

13

[dcl.fct.def.default]/2-3:削除されたものとして定義されていない

2アン明示的ディフォルト機能が それが暗黙のうちにconstexprとして を宣言されていた場合にのみ、constexpr宣言することができます。関数が明示的にその最初の 宣言、

  • にデフォルト設定されている場合、暗黙的にそれが暗黙的に宣言されていたかのように、それは同じ例外指定を持つ暗黙的な宣言が可能かどうconstexprと考えられ、そして、
  • されます([except.spec])。

3であれば、明示的に互換性がない 例外仕様で宣言されているデフォルト設定されている機能([except.spec]) 暗黙宣言の例外指定と、その後

  • 関数が最初の宣言で明示的にデフォルト設定されている場合、その関数は削除済みとして定義されます。

  • これ以外の場合、プログラムは不正です。必ずしもfooのデフォルトコンストラクタの最初の宣言であり、換言すれば

foo() = default;は、 『constexpr可能な場合』と 『noexcept可能な場合』であろう。 constexprnoexceptを明示的に記述することはまだ有用です。それは「constexpr/noexceptにできない場合、私に叫ぶ」という意味です。

関連する問題