为什么 std::is_nothrow_move_assignable 取决于析构函数的存在?
Why does std::is_nothrow_move_assignable depend on the presence of a destructor?
我有一个 class 如下所示:
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
(由于历史原因)。
用户声明的析构函数抑制了移动特殊成员函数的隐式生成 ([class.copy]/p9, 20)。因此,C
只有一个复制构造函数和一个复制赋值运算符;后者用于执行 "move" 赋值,并且可能会抛出。
我有一个 class 如下所示:
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
(由于历史原因)。
用户声明的析构函数抑制了移动特殊成员函数的隐式生成 ([class.copy]/p9, 20)。因此,C
只有一个复制构造函数和一个复制赋值运算符;后者用于执行 "move" 赋值,并且可能会抛出。