我正在阅读此http://en.wikipedia.org/wiki/C%2B%2B0x#Modification_to_the_definition_of_plain_old_data
它提到了普通的默认构造函数,普通的复制构造函数,复制赋值运算符,普通的析构函数。什么是微不足道的,而不是微不足道的?
答案 0 :(得分:73)
简单来说,“普通”特殊成员函数字面意思是以非常直接的方式完成其工作的成员函数。对于不同类型的特殊成员函数,“直截了当的方式”意味着不同的东西。
对于默认构造函数和析构函数是“平凡的”意味着字面上“什么都不做”。对于复制构造函数和复制赋值运算符,“简单”意味着“相当于简单的原始内存复制”(就像使用memcpy
复制一样)。
如果你自己定义一个构造函数,它被认为是非平凡的,即使它没有做任何事情,所以编译器必须隐式定义一个简单的构造函数。
为了使特殊的成员函数满足上述要求,该类必须具有非常简单的结构,在创建或销毁对象时不能要求任何隐藏的初始化,或者当它是任何隐藏的额外内部操作时被复制。
例如,如果类具有虚函数,则在创建此类的对象时需要一些额外的隐藏初始化(初始化虚方法表等),因此该类的构造函数不符合条件。
另一个例子,如果一个类有虚拟基类,那么这个类的每个对象可能都包含指向同一个对象的其他部分的隐藏指针。这样的自引用对象不能通过简单的原始内存复制例程(如memcpy
)进行复制。需要额外的操作才能正确地重新初始化副本中的隐藏指针。因此,此类的复制构造函数和复制赋值运算符不符合条件。
由于显而易见的原因,这个要求是递归的:类的所有子对象(基类和非静态成员)也必须具有普通的构造函数。
答案 1 :(得分:29)
如果满足以下所有条件,则A类的构造函数为trivial:
答案 2 :(得分:21)
已经有正确的答案,但这里是标准的引用(当我遇到这篇文章时我正在寻找):
(§12.1/ 5) 如果它不是用户提供的,则默认构造函数是微不足道的,如果:
- 它的类没有虚函数(10.3),没有虚基类(10.1)和
- 其类的非静态数据成员没有括号或等于初始化程序,以及
- 其类的所有直接基类都有简单的默认构造函数和
- 对于类类的所有非静态数据成员(或其数组),每个这样的类都有一个普通的默认构造函数。
这是来自C ++ 11。 C ++ 03缺少第二项并使用短语隐式声明而不是非用户提供的。它是完全相同的。
请注意,此规范仅涵盖普通的默认构造函数。单词属性 trivial 也可用于不同的上下文,例如复制构造函数。