具有抑制移动构造/分配的类型如何仍被认为是可移动的?

Bal*_*n K 26 c++ move-semantics c++11

struct copyable { // and movable
  copyable() = default;
  copyable(copyable const&) { /*...*/ };
  copyable& operator=(copyable const&) { /*...*/ return *this; }
};
Run Code Online (Sandbox Code Playgroud)

由于复制构造函数和复制赋值操作函数是显式定义的,因此它表示编译器不能隐式定义移动构造函数和移动赋值函数,因此不允许移动操作.

能告诉我上述理解是否正确吗?

son*_*yao 31

它表示编译器无法隐式定义移动构造函数和移动赋值函数

恩,那就对了.

因此不允许移动操作.

不,移动操作仍然可以通过复制构造函数和复制赋值运算符执行(尽管可能不是您预期的情况),因为rvalue总是可以绑定到const&.

更确切地说,类copyable仍然是MoveConstructibleMoveAssignable.

类不必实现移动构造函数来满足此类型要求:采用const T&argument的复制构造函数可以绑定rvalue表达式.

如果MoveConstructible类实现了移动构造函数,它还可以实现移动语义,以利用构造后的rv值未指定的事实.

该类型不必实现移动赋值运算符以满足此类型要求:通过值或作为const Type&获取其参数的复制赋值运算符将绑定到rvalue参数.

如果MoveAssignable类实现了移动赋值运算符,它还可以实现移动语义,以利用赋值后的rv值未指定的事实.

正如@Curious指出的那样,你可以声明移动构造函数并显式移动赋值运算符delete以使其copyable不可移动; 然后使用rvalue表达式选择deleteed重载并且编译失败.

  • 我认为值得一提的是如何明确删除移动构造函数和赋值运算符会改变一些事情 (5认同)
  • 但删除的移动成员与未删除的复制成员相结合几乎总是一个逻辑错误,因为该类无法满足`CopyConstructible`和`CopyAssignable`要求(需要从rvalues复制).例如,这将禁止按值从工厂函数返回本地左值.指南:永远不要删除移动成员:/sf/answers/2717412491/ (3认同)
  • @Curious已添加. (2认同)