sirve que para ejemplo c++ constructor pod

que - ¿No puede el tipo de POD de C++ tener algún constructor?



default constructor java (3)

Tengo una clase y una variable const.

struct A { int b; }; A const a;

La clase A es POD y se puede inicializar así.

A const a = { 3 };

En mi humilde opinión, se ve bien tener un constructor como este.

struct A { int b; A(int newB) : b(newB) { } };

Pero Clang asume A como un tipo no agregado. ¿Por qué no puedo tener un constructor así? ¿O debería hacer algo más?

Modifiqué la pregunta para presentar mi significado original. Había escrito la struct como class por error, y lo siento por @Johannes por confundir :)


La clase A es POD y se puede inicializar así.

Lo siento, eso está mal. Porque b es privado, la clase no es un POD.

Pero Clang asume A como un tipo no agregado. ¿Por qué no puedo tener un constructor así? ¿O debería hacer algo más?

Esta es una limitación de C ++ tal como existe actualmente. C ++ 0x ya no tendrá esta limitación. Si bien en C ++ 0x su tipo tampoco es un POD, su inicialización funcionará (suponiendo que haga public ese constructor).

(Además, creo que un término mejor para que utilices aquí es "agregado". El requisito para usar { ... } es que tu clase es un agregado. No tiene que ser un POD).


Las otras respuestas describen las reglas de POD bastante bien. Si desea obtener un estilo de inicialización similar a un constructor para un POD, puede usar una función de estilo de make_ , por ejemplo:

struct A { int i_; }; A make_A(int i = 0) { A a = { i }; return a; }

Ahora puedes obtener instancias POD inicializadas como:

A a = make_A();


POD significa un tipo de datos antiguo simple que, por definición, no puede tener un constructor definido por el usuario.

POD es en realidad un tipo agregado (ver la siguiente cita). Entonces, ¿qué es el agregado? El estándar de C ++ dice en la sección §8.5.1 / 1,

Un agregado es una matriz o una clase (cláusula 9) sin constructores declarados por el usuario (12.1), sin miembros de datos no estáticos protegidos o privados (cláusula 11), sin clases base (cláusula 10) y sin funciones virtuales (10.3).

Y la sección §9 / 4 de la norma C ++ dice:

[....] Un POD-struct es una clase agregada que no tiene miembros de datos no estáticos de tipo non-POD-struct, non-POD-union (o matriz de dichos tipos) o referencia, y no tiene usuario Operador de asignación de copia definido y sin destructor definido por el usuario . De manera similar, una unión POD es una unión agregada que no tiene miembros de datos no estáticos de tipo no POD-struct, unión no-POD (o matriz de dichos tipos) o referencia, y no tiene un operador de asignación de copia definido por el usuario y ningún destructor definido por el usuario . Una clase POD es una clase que es una estructura POD o una unión POD.

A partir de esto, también queda claro que la clase / estructura / unión POD no puede tener también un operador de asignación definido por el usuario y un destructor definido por el usuario .

Sin embargo, hay otros tipos de POD. La sección §3.9 / 10 dice:

Los tipos aritméticos (3.9.1), los tipos de enumeración, los tipos de puntero y el puntero a los tipos de miembros (3.9.2), y las versiones calificadas por CV de estos tipos (3.9.3) se denominan colectivamente tipos escalares. Los tipos escalares, los tipos de estructura POD, los tipos de unión POD (cláusula 9), las matrices de estos tipos y las versiones calificadas por CV de estos tipos (3.9.3) se denominan colectivamente tipos POD .

Lea estas preguntas frecuentes: ¿Qué es un "tipo POD"?