2011-06-27 13 views
58

En términos sencillos, ¿cuál es la diferencia entre los tipos triviales, los tipos de diseño estándar y los POD?diseño trivial vs. estándar vs. POD

Específicamente, deseo determinar si new T es diferente de 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 cuestión lado, puede alguno de estos rasgos de tipo implementarse sin magia compilador?)

+0

Creo que es un poco tarde para mencionar esto. Pero para las personas que buscan una respuesta elaborada detallada, aquí está el enlace. Verifique la respuesta de R Martinho Fernandes http://stackoverflow.com/questions/4178175/what-are-aggregates-and-pods-and-how-why-are-they-special/4178176#4178176 – jmishra

Respuesta

52

No creo que se pueda hacer en términos sencillos, al menos sin un lote de explicación adicional. Un punto importante es la inicialización estática frente a la dinámica, pero explicando que para un lego sería varias páginas en sí mismo ...

Los POD se (mal) definieron 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 cae la designación "POD" (casi) completamente, 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.

Desde new T vs new T() trata de inicialización, que probablemente quieren is_trivial.

No estoy seguro de que se requiera la magia del compilador. Mi reacción inmediata sería probablemente sí, pero conociendo algunas de las cosas que las personas han hecho con TMP, me es difícil estar seguro de que alguien no podría hacer esto también ...

Editar: por ejemplo, tal vez sea mejor acaba de citar los ejemplos del 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 es también una estructura POD.

+0

+1, por mi leer 'is_trivial' es la respuesta correcta. – ildjarn

+0

Entonces, ¿la configuración 'trivial + estándar = POD' siempre se mantiene? – fredoverflow

+1

@FredOverflow: sí, con la condición de que sea transitivo, por lo que todos los miembros (no estáticos) deben ser de diseño trivial + estándar. –

7

Para los tipos de POD new T() es el valor de inicialización (se valorará a inicializar todos los miembros), y new T no va a inicializar el miembros (inicialización predeterminada). Para las diferencias entre las diferentes formas de inicialización see this question. En pocas palabras: necesita is_pod.