为什么std :: is_nothrow_move_assignable取决于析构函数的存在?

Mar*_*utz 0 c++ destructor move-semantics noexcept c++11

我有一个类如下:

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

    Member_1 m_1;
    // ...
    Member_N m_N;
};
Run Code Online (Sandbox Code Playgroud)

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

现在,

static_assert(std::is_nothrow_move_assignable<Member_1>::value);
// ...
static_assert(std::is_nothrow_move_assignable<Member_N>::value);
Run Code Online (Sandbox Code Playgroud)

都很满意.然而,

static_assert(std::is_nothrow_move_assignable<C>::value);
Run Code Online (Sandbox Code Playgroud)

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

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

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

T.C*_*.C. 5

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