【发布时间】:2012-01-27 02:36:13
【问题描述】:
我知道,当我定义一个空类并且根本不提供任何声明时,编译器会为默认和复制构造函数、析构函数和复制赋值运算符提供定义。
这有什么规则?编译器何时不提供复制构造函数?移动构造函数和移动赋值运算符呢?
(例如:如果我的类有 int& 这样的引用成员,编译器将不会为任何赋值运算符提供定义。其他什么时候会发生这种情况?)
【问题讨论】:
-
@Mr.TAMER:维基百科很好,但我想有一个完整的 SO 列表,最好是标准引号。 :) 此外,维基百科文章没有说明何时获得移动构造函数以及何时不提供复制 ctor / 赋值操作。
-
会不会不提供赋值运算符,即使你有引用成员。尝试使用它会生成编译,不是因为它不存在,而是因为它无效。
-
在不输入标准第 12 章的大量内容的情况下,我们应该如何回答这个问题?这一切都在那里,它是标准中非常明确的一部分。
-
“我知道,当我定义一个空类并且根本不提供任何声明时,编译器将提供默认和复制构造函数、析构函数和复制赋值运算符的定义。”。这是不正确的。它只会提供这些的声明。并且定义仅在需要时使用。
-
@Xeo 不,这些不是形式。如果你有
struct A { void operator=(int); operator int(); int &x; }; A a{*new int}, b{*new int};,如果你说a = b;,它会给出一个错误,因为它确实提供了复制分配的声明。如果不是,它不是是一个错误,但它会将b转换为int。
标签: c++ constructor c++11 destructor assignment-operator