具有抑制移动构造/赋值的类型如何仍被视为可移动类型?


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不可移动;然后使用右值表达式,将选择deleteed重载,编译将失败。

相关内容

最新更新