C++11:是用户声明的默认复制构造函数
C++ 11: is a defaulted copy constructor user declared?
我想是这样,但我正在寻找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设置了当移动构造函数被隐式声明时的条件,并且用户声明的复制构造函数的存在排除了这种情况。你不能有
- 用户声明的复制构造函数
- 用户声明的副本分配运算符
- 用户声明的移动赋值运算符
- 用户声明的析构函数
相关文章:
- 为什么默认复制函数在按值发送参数时不调用?
- 如何在QTreeView中禁用默认复制行为?
- 通过默认复制构造函数比较 C++ 字符串是否会影响性能,原因为何?
- 默认复制/移动构造函数时 GDB 中的奇怪行为
- C++默认复制构造函数不可行
- 没有数据成员和大括号语法的类的默认复制构造函数
- C++中默认复制构造函数的奇怪行为
- 将功能添加到默认复制构造函数中
- C 带有什么默认复制构造函数使用什么初始化基本复制构造函数
- 如果我默认复制构造函数,将生成构造函数和移动分配
- 为什么要删除基类的默认复制并移动ctor和赋值
- 对象数组的默认复制行为
- C++11:是用户声明的默认复制构造函数
- 外部C结构的C++默认复制/移动赋值运算符不是常量
- 删除默认C++复制和移动构造函数和赋值运算符的缺点
- 非默认复制构造函数会减慢程序的速度吗?
- 错误:没有与默认复制构造函数调用匹配的函数
- 使用默认复制构造函数时出错:"deleted function"
- 是c++中线程安全的默认复制构造函数
- 使用模板化构造函数时禁用默认复制构造和赋值构造函数