我想是这样,但我正在寻找 C++11 语言律师来确认我的印象。下面的课是真的吗
struct X{
X(){}
X(X const&)=default;
};
不会自动启用移动,即获取X(X&&)
and operator=(X&&)
,因为它的复制构造函数是“用户声明的”,即使它看起来等同于
struct X{
};
这将在使用时得到隐含声明X(X const&)
和X(X&&)
(平凡)定义的等。
从标准:
8.4.2 显式默认函数 [dcl.fct.def.default]
4 - [...] 一个特殊的成员函数是用户提供的,如果它是用户声明的并且在其第一次声明时没有显式地默认或删除。[...]
显式默认值可以与其声明相结合,也可以分开:
struct S {
S();
};
S::S() = default;
在任何一种情况下,它的(第一个)声明都使它成为用户声明的。
是的,您的默认复制分配运算符排除了隐式移动 ctor。
BTW put=default
实际上是一个定义。我记得尝试实现一个 pimpl 习惯用法,std::unique_ptr
并且不得不=default
从头文件中删除并将它们放入实现文件中,因为析构函数unique_ptr
需要它试图清理的类的定义。
default
ed 复制构造函数确实是“用户声明的”;我认为添加default
实际上是他们将术语从“用户定义”更改为“用户声明”的原因。
没错,§12.8 设置了隐式声明移动构造函数时的条件,并且用户声明的复制构造函数的存在排除了这种情况。你不能拥有