¿Qué es un constructor no trivial en C ++?

Estaba leyendo esta http://en.wikipedia.org/wiki/C%2B%2B0x#Modification_to_the_definition_of_plain_old_data

Menciona el constructor trivial predeterminado, el constructor de copia trivial, el operador de asignación de copia, el destructor trivial. ¿Qué es trivial y no trivial?

En palabras simples, una función de miembro especial “trivial” significa literalmente una función miembro que hace su trabajo de una manera muy directa. La “manera directa” significa algo diferente para diferentes tipos de funciones especiales de miembros.

Para un constructor y destructor por defecto es “trivial” significa literalmente “no hacer nada en absoluto”. Para el constructor de copias y el operador de asignación de copias, ser “trivial” significa literalmente “ser equivalente a la simple copia de memoria en bruto” (como copiar con memcpy ).

Si usted mismo define un constructor, se considera que no es trivial, incluso si no hace nada, por lo que el comstackdor debe definir implícitamente un constructor trivial.

Para que una función miembro especial satisfaga los requisitos anteriores, la clase debe tener una estructura muy simplista, no debe requerir ninguna inicialización oculta cuando se crea o destruye un objeto, ni manipulaciones internas ocultas adicionales cuando se está copiando.

Por ejemplo, si la clase tiene funciones virtuales, requerirá algunas inicializaciones ocultas adicionales cuando se crean objetos de esta clase (tabla de método virtual de inicialización y demás), por lo que el constructor de esta clase no calificará como trivial.

Para otro ejemplo, si una clase tiene clases base virtuales, entonces cada objeto de esta clase puede contener punteros ocultos que apuntan a otras partes del mismo objeto. Tal objeto autorreferencial no puede copiarse mediante una simple rutina de copia en bruto (como memcpy ). Manipulaciones adicionales serán necesarias para reinicializar adecuadamente los punteros ocultos en la copia. Por esta razón, el constructor de copias y el operador de asignación de copias para esta clase no calificarán como triviales.

Por razones obvias, este requisito es recursivo: todos los subobjetos de la clase (bases y miembros no estáticos) también deben tener constructores triviales.

Un constructor de una clase A es trivial si todo lo siguiente es verdadero:

  • Está implícitamente definido (comstackdor sintetizado)
  • A no tiene funciones virtuales ni clases base virtuales
  • Todas las clases base directas de A tienen constructores triviales
  • Las clases de todos los miembros de datos no estáticos de A tienen constructores triviales

Ya hay respuestas correctas, pero aquí está la cita del Estándar (que estaba buscando cuando me encontré con esta publicación):

(§12.1 / 5) Un constructor predeterminado es trivial si no lo proporciona el usuario y si:
– su clase no tiene funciones virtuales (10.3) ni clases base virtuales (10.1), y
– ningún miembro de datos no estático de su clase tiene un inicializador de llave o igual, y
– todas las clases base directas de su clase tienen constructores triviales por defecto, y
– para todos los miembros de datos no estáticos de su clase que son del tipo de clase (o matriz de los mismos), cada clase tiene un constructor predeterminado trivial.

Esto es de C ++ 11. C ++ 03 carece del segundo elemento y usa la frase implícitamente declarada en lugar de no provista por el usuario . Por lo demás, es idéntico.

Tenga en cuenta que esta especificación solo cubre constructores triviales por defecto. La palabra atributo trivial también se puede usar en diferentes contextos, por ejemplo, copiar constructores.