什么是在C + +中不平凡的构造函数?

我正在阅读这个http://en.wikipedia.org/wiki/C%2B%2B0x#Modification_to_the_definition_of_plain_old_data

它提到简单的默认构造函数,简单的复制构造函数,复制赋值运算符,简单的析构函数。 什么是微不足道的,而不是微不足道的?

简而言之,“微不足道”的特殊成员函数字面意思是一个以非常直接的方式完成工作的成员函数。 对于不同types的特殊会员职能,“直接的方式”意味着不同的事物。

对于“微不足道”的默认构造函数和析构函数,意思是“什么也不做”。 对于复制构造函数和复制赋值操作符,“微不足道”的意思是“简单的原始内存复制”(就像复制memcpy )。

如果你自己定义一个构造函数,即使它没有做任何事情,它也被认为是不平凡的,所以一个简单的构造函数必须由编译器隐式定义。

为了使一个特殊的成员函数满足上述要求,类必须有一个非常简单的结构,当一个对象被创build或销毁时,它不能要求任何隐藏的初始化,或者当它被复制时,隐藏的额外的内部操作。

例如,如果类具有虚函数,那么当创build这个类的对象(初始化虚拟方法表等等)时,将需要一些额外的隐藏的初始化,所以这个类的构造函数不会被认为是微不足道的。

又例如,如果一个类有虚拟基类,那么这个类的每个对象都可能包含指向同一对象的其他部分的隐藏指针。 这样的自引用对象不能被简单的原始内存拷贝例程(如memcpy )拷贝。 需要额外的操作来正确地重新初始化副本中的隐藏指针。 由于这个原因,这个类的拷贝构造函数和拷贝赋值操作符将不会被认为是微不足道的。

由于显而易见的原因,这个要求是recursion的:类的所有子对象(基类和非静态成员)也必须有微不足道的构造函数。

如果满足以下所有条件,则类A的构造函数是微不足道的 :

  • 它是隐式定义的(编译器合成)
  • A没有虚函数,也没有虚拟基类
  • A的所有直接基类具有简单的构造函数
  • A的所有非静态数据成员的类都有简单的构造函数

已经有了正确的答案,但这里是标准的引用(当我遇到这个post的时候我正在寻找):

(§12.1/ 5)如果一个默认的构造函数不是用户提供的,并且如果:
– 它的类没有虚函数(10.3),也没有虚函数类(10.1)
– 没有类的非静态数据成员有一个括号或等于初始值设定项,和
– 它的类的所有直接基类有简单的默认构造函数,
– 对于类的types(或数组)的所有非静态数据成员,每个类都有一个简单的默认构造函数。

这是来自C ++ 11。 C ++ 03缺less第二项,并使用隐式声明不是用户提供的短语。 它是相同的。

请注意,这个规范只覆盖了普通的默认构造函数。 单词属性trivial也可以用在不同的上下文中,例如复制构造函数。