En términos sencillos, ¿cuál es la diferencia entre el trivial tipos, estándar de diseño de tipos y Vainas?
En concreto, se desea determinar si 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
debo elegir?
(Como una pregunta, ¿alguno de estos rasgos de tipo aplicarse sin compilador de magia?)
Respuestas
¿Demasiados anuncios?No creo que se puede hacer en verdad los términos del laico, al menos sin un montón de explicación adicional. Un punto importante es estático versus dinámico de inicialización, pero explicando que para un profano en la materia sería varias páginas en la misma...
Las vainas se (mal)definido en C++98. Realmente hay dos separar las calidades de los involucrados, ni expresa muy bien: 1) que si se compila un C declaración struct en C++, lo que se obtiene debe ser equivalente a lo que tenía en C. 2) UNA VAINA sólo se necesita/uso estático (no dinámico) inicialización.
C++0x/11 gotas de la "VAINA" designación de (casi) por completo, a favor de "trivial" y "diseño estándar". Diseño estándar está diseñado para capturar la primera intención de crear algo con un diseño de la misma que se obtendría en C. Trivial es la intención de captar el apoyo para la inicialización estática.
Desde new T
vs new T()
ofertas con la inicialización, usted probablemente querrá is_trivial
.
No estoy seguro acerca de compilador de la magia de ser necesario. Mi reacción inmediata sería probablemente sí, pero conociendo algunas de las cosas que la gente ha hecho con la TMP, tengo un tiempo difícil tener la certeza de que alguien no podía hacer esto demasiado...
Edit: para los ejemplos, tal vez es mejor para sólo 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 usted sin duda puede adivinar, POD
también es una VAINA struct.
Para el POD tipos new T()
en el valor de inicialización(valor de inicialización de todos los miembros) ,y new T
no inicializar los miembros (por defecto-inicialización). Para las diferencias entre las distintas formas de inicialización de ver a esta pregunta. Línea de base: usted necesita is_pod
.