【发布时间】:2013-10-26 12:06:03
【问题描述】:
说一堂课
class Piece {} ;
如果我是正确的,那应该相当于:
class Piece {
//C++ 03
Piece (); //default constructor
Piece( const Piece&); //copy constructor
Piece& operator=(const Piece&); //copy assignment operator
~Piece(); //destructor
//Since C++ 11
Piece(Piece&&); //move constructor
Piece& operator=(Piece&&); //move assignment operator
};
那么我能说些什么呢?
一)
class Pawn{
~Pawn() {}// Only destructor
};
b)
class Bishop{
Bishop(Bishop&& ) {}// Only move constructor
};
c)
class Knight{
Knight(Knight&&, int =0) {} // move constructor, when no second arg present
};
d)
class Rook {
Rook(const Rook& ) {}// Only copy constructor
};
e)
class King{
King& operator=(const King&) = delete;
};
根据我的理解,编译器将生成:
- a) 默认构造函数,复制构造函数,复制赋值运算符,(移动构造函数/赋值运算符?)
- b) 析构函数
- c) 析构函数
- d) 复制赋值运算符和析构函数(移动构造函数/赋值运算符?)
- e) 默认构造函数、复制构造函数、析构函数(移动构造函数/赋值运算符?)
我在这里是正确还是遗漏了什么?
基本上C++11有什么新的生成函数的规则,当用户没有提供的时候?
【问题讨论】:
-
只有在原型后面加上
= default,你的第一段代码才是正确的。如果您自己实现它们,它们将不再是微不足道的,并使类成为非 POD 等。 -
@KonradRudolph:“如果我是正确的,那应该等同于” 可能翻译为“这会为我生成以下默认构造函数/赋值运算符”,因为它应该反映
class Piece{};中可用的运算符/构造函数 -
“等价”是一个糟糕的词选择。还是有区别的,这是关于琐碎,可以通过
std::is_trivially_copyable特征等检测到。而“编译器”与这个问题无关。语言规则决定了隐式声明和隐式定义的内容。 -
@KerrekSB 抱歉,请随时重新措辞/短语/编辑
-
拼出所有不同的案例太痛苦了。我很确定我们已经在 SO 上有关于此的有用帖子,否则请获取标准的副本并自己阅读第 12.8 节。它非常清晰易读。