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

15

我猜是这样的,但我正在寻找C ++11语言专家来确认我的印象。以下类是否为真

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

即使复制构造函数看起来等效于 X(X&&)operator=(X&&),但由于其复制构造函数是“用户声明的”,因此不会自动启用移动功能。

struct X{
};

这将获取所有隐式声明并(微不足道地)定义的X(X const&)X(X&&)等内容。


感谢您帮助我避免在我的即将出版的C++书中写废话。 - PeterSom
4个回答

3

来自标准:

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

4 - [...] 如果一个特殊成员函数在其第一次声明时被用户声明但未显式地默认或删除,则该特殊成员函数是由用户提供的。[...]

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

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

无论哪种情况,其(第一个)声明都使其成为用户声明。

3

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

顺便说一下,放置=default实际上是一个定义。我记得尝试使用pimpl习语与std::unique_ptr并不需要从头文件中删除=default并将它们放在实现文件中,因为unique_ptr的析构函数需要清理的类的定义。


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

1

正确的,§12.8设置了移动构造函数隐式声明的条件,用户声明的复制构造函数的存在排除了该条件。您不能拥有

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接