这应该是一个微不足道的问题,但我无法在 stackoverflow 上明确找到它。
如果用户未提供以下内容,则将隐含定义。
- 默认(无参数)构造函数
- 复制构造函数
- 复制赋值运算符
- 析构函数
但是我在某处读过(我现在似乎找不到),在某些情况下编译器不会隐式实现它们。
这些条件是什么?
这应该是一个微不足道的问题,但我无法在 stackoverflow 上明确找到它。
如果用户未提供以下内容,则将隐含定义。
但是我在某处读过(我现在似乎找不到),在某些情况下编译器不会隐式实现它们。
这些条件是什么?
默认构造函数(例如,X()
)将不会在以下情况下隐式生成:
const
对象或没有或不可访问的默认构造函数的类)X() = delete;
X(const X&)
如果出现以下情况,将不会隐式生成复制构造函数(例如
X
构造函数采用的类X
,X&
或const X&
)X(const X&) = delete;
X& operator=(const X&)
如果出现以下情况,将不会隐式生成复制赋值运算符(例如
X
一个operator=
服用类X
,X&
或const X&
)const
对象或没有或无法访问赋值运算符的类)X& operator=(const X&) = delete;
~X()
在以下情况下不会隐式生成析构函数(例如
~X() = delete;
X(X&&)
在以下情况下,将不会隐式生成移动构造函数(C++11)(例如
X
,一个构造函数采用X&&
)const
、是引用,或者具有已删除、不可访问或不明确的移动构造函数)X(X&&) = delete;
X& operator=(X&&)
在以下情况下,将不会隐式生成移动赋值运算符(C++11)(例如
X
,一个operator=
taking X&&
)const
、是引用,或者有一个已删除、不可访问或不明确的移动分配运算符)X& operator=(X&&) = delete;