C ++ 11:是否声明了默认的复制构造函数用户?

时间:2012-08-22 12:50:27

标签: c++ c++11

我想是的,但我正在寻找C ++ 11语言律师来证实我的印象。以下类

是真的吗?
struct X{
X(){}
X(X const&)=default;
};

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

struct X{
};

将同时使用X(X const&)X(X&&)等,并在使用时明确声明和(平凡)定义。

4 个答案:

答案 0 :(得分:3)

来自标准:

  

8.4.2明确默认的函数[dcl.fct.def.default]

     

4 - [...]特殊成员函数是用户提供的,如果它是用户声明的而不是显式的   在第一份声明中违约或删除。 [...]

显式默认值可以与其声明结合使用,也可以单独使用:

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

BTW put =default实际上是定义。我记得trying to implement一个带有std::unique_ptr的pimpl习语,不得不从标题中删除=default并将它们放在实现文件中,因为unique_ptr的析构函数需要类的定义它正在努力清理。

答案 3 :(得分:1)

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

  • 用户声明的复制构造函数
  • 用户声明的副本分配运算符
  • 用户声明的移动分配运算符
  • 用户声明的析构函数