44 votos

trivial vs layout estándar vs POD

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?)

39voto

Jerry Coffin Puntos 237758

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.

5voto

Armen Tsirunyan Puntos 59548

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.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X