我读到了这个:
N3337 [class.copy]/9:如果类 X 的定义没有显式声明移动构造函数,则当且仅当
X 没有用户声明的复制构造函数,X 没有用户声明的复制赋值运算符,X 没有用户声明的移动赋值运算符,X 没有用户声明的析构函数,并且移动构造函数将不能隐式定义为已删除。声明析构函数并将其定义为默认值算作用户声明。
然而,这段代码:
struct A1 { virtual ~A1() {}; };
struct B1 : public A1 {
~B1() override {}; };
struct A2 { virtual ~A2() = default; };
struct B2 : public A2 {
~B2() override = default; };
struct A_NO_VIRTUAL {
~A_NO_VIRTUAL() {}; };
struct B_NO_VIRTUAL : public A_NO_VIRTUAL {
~B_NO_VIRTUAL() {}; };
int main() { std::cout << std::is_nothrow_move_constructible_v<B1> << std::is_nothrow_move_constructible_v<B2> << std::is_nothrow_move_constructible_v<B_NO_VIRTUAL> << std::endl; }
Run Code Online (Sandbox Code Playgroud)
打印数量:111
请参阅:http ://coliru.stacked-crooked.com/a/5c53057a1a4ce3f4
预计:000
这是为什么?
is_move_constructible粗略检查是否MyClass x(std::move(y));有效。如果没有移动构造函数,但有一个复制构造函数,则它可能是有效的MyClass,它将默默地用来代替移动构造函数。
声明析构函数仅删除移动操作,但保留复制操作(后者已被弃用)。
要正确测试这一点,请将成员变量添加到您的类中,并记录对成员的复制和移动构造函数的调用。