La biblioteca de impulso, y parece el próximo estándar C++ 0x, define varias plantillas de rasgos de tipo para diferenciar entre objetos que tienen constructores triviales, constructores de copia, asignación o destructores, frente a objetos que no t. Uno de los usos más importantes de esto es optimizar los algoritmos para ciertos tipos, p. mediante el uso de memcpy.C++: rasgos del tipo has_trivial_X
Pero, no entiendo la diferencia práctica real entre todas las diversas plantillas has_trivial_X. El estándar de C++ solo define dos amplias categorías de tipos que nos conciernen aquí: POD y no POD. Un tipo no es POD si tiene un constructor definido, un constructor de copia, un operador de asignación o un destructor. En otras palabras, cualquier cosa que no sea un tipo incorporado, o una C-struct de tipos incorporados, no es un POD.
¿Cuál es el punto de diferenciar, por ejemplo, has_trivial_assign y has_trivial_constructor? Si un objeto tiene un operador de asignación no trivial O un constructor no trivial, no es un POD. Entonces, ¿bajo qué circunstancias sería útil saber que un objeto tiene un operador de asignación trivial, pero un constructor no trivial?
En otras palabras, ¿por qué no definir una sola plantilla de tipo de rasgo, is_pod<T>
, y terminar con eso?