struct copyable { // and movable
copyable() = default;
copyable(copyable const&) { /*...*/ };
copyable& operator=(copyable const&) { /*...*/ return *this; }
};
由于复制构造函数和复制赋值操作函数是显式定义的,因此它表示编译器无法隐式定义移动构造函数和移动赋值函数,因此不允许移动操作。
你能告诉我我的上述理解是否正确吗?
它表示编译器不能隐式定义移动构造函数和移动赋值函数
是的,没错。
因此不允许移动操作。
否,移动操作仍可以通过复制构造函数和复制赋值运算符执行(尽管这可能不是您预期的情况),因为右值始终可以绑定到const&
。
更准确地说,类copyable
仍然是 MoveConstructible 和 MoveAssignable 。
类不必实现移动构造函数来满足此类型要求:采用const T&参数的复制构造函数可以绑定右值表达式。
如果 MoveConstructible 类实现了移动构造函数,它还可以实现移动语义,以利用构造后未指定 rv 值的事实。
和
该类型不必为了实现移动赋值运算符来满足此类型要求:按值或作为 const Type& 获取其参数的复制赋值运算符将绑定到 rvalue 参数。
如果 MoveAssignable 类实现了移动赋值运算符,则它还可以实现移动语义,以利用赋值后 rv 的值未指定的事实。
如@Curious所述,您可以显式声明移动构造函数和移动赋值运算符 delete 以使copyable
不可移动;然后使用右值表达式,将选择delete
ed重载,编译将失败。