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 que un destructor y un constructor por defecto sean "triviales" significa literalmente "no hacer nada". 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 compilador 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 está siendo copiado
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 inicial 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 podría 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 de la memoria (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.
No hacer nada ... Entonces, ¿qué es un operador de asignación de copias? ;) –
También se me permite tener un ctor no contributivo como (Rect r) {l = r ....} –
@ acidzombie24: Hice algunas correcciones para cubrir las funciones de los miembros de copia. Tu segundo comentario no está claro para mí. Cualquier constructor definido por el usuario no es trivial, por lo que una vez que lo define, la clase ya no es un POD. – AnT