26
这应该是一个微不足道的问题,但我不能明确地找到它的计算器。何种条件下,编译器不会定义implicits(构造函数,析构函数,拷贝构造函数,拷贝赋值)
下面将如果不是由用户提供的隐式地定义。
- 默认(无参数)构造
- 拷贝构造函数
- 拷贝赋值运算符
- 析构函数
不过我读的地方(我不能似乎现在找到),有编译器不会隐式实现它们的一些条件。
这些是什么条件呢?
这应该是一个微不足道的问题,但我不能明确地找到它的计算器。何种条件下,编译器不会定义implicits(构造函数,析构函数,拷贝构造函数,拷贝赋值)
下面将如果不是由用户提供的隐式地定义。
不过我读的地方(我不能似乎现在找到),有编译器不会隐式实现它们的一些条件。
这些是什么条件呢?
The Default Constuctor(例如,X()
)将不会被隐式生成的,如果:
const
对象或一个没有或不可访问的默认构造函数的类)X() = delete;
The Copy Constructor(例如,X(const X&)
)将不会被隐若产生:
X
类的构造函数取X
,X&
或const X&
)X(const X&) = delete;
The Copy Assignment Operator(例如,X& operator=(const X&)
)将不会被隐若产生:
X
的operator=
采取X
,X&
或const X&
)类const
对象或没有或不可访问赋值运算符的类)X& operator=(const X&) = delete;
The Destructor不生成一个(例如,
~X()
)将不会被是否隐式生成Ë明确告诉编译器使用不产生一个~X() = delete;
The Move Constructor(C++ 11)(例如,X(X&&)
)将不会被隐若产生:
X
,构造函数采用X&&
)const
,是一个参考,或已被删除的,不可访问,或不明确的移动构造函数)X(X&&) = delete;
The Move Assignment Operator(C++ 11)(例如:,X& operator=(X&&)
)将不会被隐若产生:
X
类,一个operator=
采取X&&
)const
,是引用或具有删除,不可访问或含糊不清的移动赋值运算符)X& operator=(X&&) = delete;
那么,在所有这些第二点,它会被隐式定义,就像'delete'不产生一个d。 – 2013-03-23 19:06:55
+1不要忘记C++ 11的新增功能,您可以明确声明它们不应该被创建('A(const A&)= delete;'),为了完整性您应该添加Move构造函数。 – pickypg 2013-03-23 19:10:22
@pickypg:我不确定移动构造函数,如果你将我想要的信息添加到我的答案中,我会很高兴 – 2013-03-23 19:11:29