0

我有一个像下面这样的类:

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

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

显示的两个特殊成员函数是唯一声明的。

现在,

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);

断言。如果我删除空的析构函数,它就会通过。

析构函数与移动赋值运算符有什么关系?新的五规则?

编译器是 GCC 4.9.3 -std=c++0x(出于历史原因)。

4

1 回答 1

5

用户声明的析构函数禁止隐式生成移动特殊成员函数 ([class.copy]/p9, 20)。因此,C只有一个拷贝构造函数和一个拷贝赋值运算符;后者用于执行“移动”任务,并且可能会抛出。

于 2015-06-24T19:39:46.393 回答