0

次のようなクラスがあります。

class C {
public:
    C() : ... {}
    ~C() {}

    Member_1 m_1;
    // ...
    Member_N m_N;
};

示されている 2 つの特別なメンバー関数は、宣言されている唯一のものです。

今、

static_assert(std::is_nothrow_move_assignable<Member_1>::value);
// ...
static_assert(std::is_nothrow_move_assignable<Member_N>::value);

すべて満足しています。まだ、

static_assert(std::is_nothrow_move_assignable<C>::value);

主張します。空のデストラクタを削除すると、パスします。

デストラクタは移動代入演算子とどのような関係がありますか? 5つの新しいルール?

コンパイラは GCC 4.9.3 です-std=c++0x(歴史的な理由から)。

4

1 に答える 1

5

ユーザー宣言のデストラクタは、move 特殊メンバー関数 ([class.copy]/p9、20) の暗黙的な生成を抑制します。したがって、Cコピー コンストラクターとコピー代入演算子しかありません。後者は「移動」割り当てを実行するために使用され、おそらくスローできます。

于 2015-06-24T19:39:46.393 に答える