我想是的,但我正在寻找C ++ 11语言律师来证实我的印象。以下类
是真的吗?struct X{
X(){}
X(X const&)=default;
};
不会自动启用移动,即获取X(X&&)
和operator=(X&&)
,因为它的复制构造函数是“用户声明的”,即使它看起来等同于
struct X{
};
将同时使用X(X const&)
和X(X&&)
等,并在使用时明确声明和(平凡)定义。
答案 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设置了隐式声明移动构造函数的条件,并且存在用户声明的复制构造函数排除了这种情况。你不能拥有