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

C++ 11: is a defaulted copy constructor user declared?

本文关键字:默认 复制 构造函数 声明 用户 C++11      更新时间:2023-10-16

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

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

不会自动启用移动,即获取X(X&&)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放置=default实际上是一个定义。我记得我试图用std::unique_ptr实现一个pimpl习惯用法,不得不从头文件中删除=default并将其放在实现文件中,因为unique_ptr的析构函数需要它试图清理的类的定义。

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

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

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