17

特に関連して、可能であればstd::vector型がnoexcept移動可能であることが重要です。

= defaultしたがって、次のような移動コンストラクターを宣言するとき

struct Object1
{
    Object1(Object1 &&other) = default;
};

std::is_nothrow_move_constructible<Object1>::valuetrueすべてのメンバー (ここでは 0)Object1は notrow-move-constructible であり、ここで回答されます。

= defaultしかし、次のコードのように、ムーブ コピー コンストラクターが宣言され、後で定義されている場合はどうなるでしょうか。

struct Object2
{
    Object2(Object2 &&other);
};
Object2::Object2(Object2 &&other) = default;

g++ 4.9.2 ではstd::is_nothrow_move_constructible<Object2>::valuefalse宣言と定義の両方noexceptを make itとしてマークする必要がありtrueます。

今、私が興味を持っているのは、実際のルールが何であるかです。特に、Effective Modern C++の Item 22 (Scott Meyers) は、私がObject2.

4

1 に答える 1

14

[dcl.fct.def.default]/p2:

関数が最初の宣言で明示的にデフォルト設定されている場合、

  • constexpr暗黙の宣言が次のようになる場合、暗黙的に次のように見なされます。
  • 暗黙的に宣言された場合と同じ例外仕様を持っています (15.4)。

後の例のように、関数が後の宣言で明示的にデフォルト設定されている場合、これらの規則は適用されないため、代わりに、デストラクタを除いて、関数はnoexcept(false)他のほとんどの関数と同様にデフォルトで考慮されます。

明示的なデフォルト設定は別の翻訳単位にある可能性があるため (pimpl の場合別の TU にある)、コンパイラがクラス定義を確認した後にムーブ コンストラクターがスローするかどうかだけを判断する一般的な方法はありません。クラス定義で (つまり、最初の宣言で) 明示的にデフォルト設定されます。

于 2015-02-22T18:41:21.607 に答える