c++ - diseño trivial vs. estándar vs. POD
constructor initialization (2)
No creo que se pueda hacer en términos verdaderamente laicos, al menos sin una gran cantidad de explicaciones adicionales. Un punto importante es la inicialización estática frente a la dinámica, pero explicando que para un lego serían varias páginas en sí mismo ...
Los POD fueron (mal) definidos en C ++ 98. En realidad, hay dos intenciones distintas involucradas, ninguna de las dos expresadas muy bien: 1) que si compila una declaración de C struct en C ++, lo que obtenga debería ser equivalente a lo que tenía en C. 2) Un POD solo necesitará / usará estática (no dinámica) inicialización.
C ++ 0x / 11 elimina la designación "POD" (casi) por completo, a favor de "trivial" y "diseño estándar". El diseño estándar está destinado a capturar el primer intento: crear algo con un diseño igual al que obtendría en C. Trivial está destinado a capturar el soporte para la inicialización estática.
Como la new T
frente a la new T()
refiere a la inicialización, probablemente desee is_trivial
.
No estoy seguro de que se requiera magia de compilador. Mi reacción inmediata sería probablemente sí, pero conociendo algunas de las cosas que las personas han hecho con TMP, me cuesta mucho estar seguro de que alguien no podría hacer esto también ...
Editar: para ver ejemplos, tal vez lo mejor sea citar los ejemplos de N3290:
struct N { // neither trivial nor standard-layout
int i;
int j;
virtual ~N();
};
struct T { // trivial but not standard-layout
int i;
private:
int j;
};
struct SL { // standard-layout but not trivial
int i;
int j;
~SL();
};
struct POD { // both trivial and standard-layout
int i;
int j;
};
Como sin duda puede adivinar, POD
también es una estructura POD.
En términos simples, ¿cuál es la diferencia entre tipos triviales, tipos de diseño estándar y POD?
Específicamente, quiero determinar si la new T
es diferente de la new T()
para cualquier parámetro de plantilla T
¿Cuál de los rasgos de tipo is_trivial
, is_standard_layout
y is_pod
debería elegir?
(Como una pregunta complementaria, ¿se puede implementar alguno de estos rasgos de tipo sin la magia del compilador?)
Para los tipos de POD, la new T()
es inicialización de valor (inicializará el valor de todos los miembros) y la new T
no inicializará los miembros (inicialización predeterminada). Para conocer las diferencias entre las diferentes formas de inicialización, vea esta pregunta . En is_pod
: necesitas is_pod
.