14

我想是这样,但我正在寻找 C++11 语言律师来确认我的印象。下面的课是真的吗

struct X{
X(){}
X(X const&)=default;
};

不会自动启用移动,即获取X(X&&)and operator=(X&&),因为它的复制构造函数是“用户声明的”,即使它看起来等同于

struct X{
};

这将在使用时得到隐含声明X(X const&)X(X&&)(平凡)定义的等。

4

4 回答 4

3

从标准:

8.4.2 显式默认函数 [dcl.fct.def.default]

4 - [...] 一个特殊的成员函数是用户提供的,如果它是用户声明的并且在其第一次声明时没有显式地默认或删除。[...]

显式默认值可以与其声明相结合,也可以分开:

struct S {
    S();
};
S::S() = default;

在任何一种情况下,它的(第一个)声明都使它成为用户声明的。

于 2012-08-22T13:42:29.587 回答
3

是的,您的默认复制分配运算符排除了隐式移动 ctor。

BTW put=default实际上是一个定义。我记得尝试实现一个 pimpl 习惯用法,std::unique_ptr并且不得不=default从头文件中删除并将它们放入实现文件中,因为析构函数unique_ptr需要它试图清理的类的定义。

于 2012-08-22T14:23:12.513 回答
2

defaulted 复制构造函数确实“用户声明的”;我认为添加default实际上是他们将术语从“用户定义”更改为“用户声明”的原因。

于 2012-08-22T12:52:17.547 回答
1

没错,§12.8 设置了隐式声明移动构造函数时的条件,并且用户声明的复制构造函数的存在排除了这种情况。你不能拥有

  • 用户声明的复制构造函数
  • 用户声明的复制赋值运算符
  • 用户声明的移动赋值运算符
  • 用户声明的析构函数
于 2012-08-22T13:24:58.530 回答