我猜是这样的,但我正在寻找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;
是的,您默认的复制分配运算符排除了隐式移动构造函数。
顺便说一下,放置=default
实际上是一个定义。我记得尝试使用pimpl习语与std::unique_ptr
并不需要从头文件中删除=default
并将它们放在实现文件中,因为unique_ptr
的析构函数需要清理的类的定义。
default
的复制构造函数确实是 "用户声明" 的;我认为添加 default
的原因实际上是他们将术语从 "用户定义" 更改为 "用户声明"。正确的,§12.8设置了移动构造函数隐式声明的条件,用户声明的复制构造函数的存在排除了该条件。您不能拥有