Lo hace. Para un tipo T
, T()
value-initializes un "objeto" del tipo T
y produce una expresión rvalue.
int a = int();
assert(a == 0);
mismo para pod-clases:
struct A { int a; };
assert(A().a == 0);
también cierto para algunas clases no POD que no tienen un usuario declararon constructor:
struct A { ~A() { } int a; };
assert(A().a == 0);
Dado que no se puede hacer A a()
(crea una declaración de función en su lugar), boost tiene una clase value_initialized
, lo que permite trabajar alrededor de eso, y C++ 1x tendrá la siguiente, alternativa, sintaxis
int a{};
En las palabras secos de la Norma, esto suena como
La expresión T(), donde T es un simple de tipo-especificador (7.1.5.2) para un objeto completo no-array tipo o el tipo void (posiblemente cv-cualificado), crea un valor de lado derecho del tipo especificado, que es el valor inicializado
Puesto que un nombre typedef es un nombre-tipo, que es un simple tipo especificador en sí, esto funciona bien.
He estado estudiando detenidamente el borrador del estándar tratando de resolver esto.Me había olvidado del typedef y estaba intentando descubrir cómo un tipo de puntero podría ser un simple-tipo-especificador (no lo es), y ahora tiene sentido: no se puede hacer int *(), pero se puede hacer T() si T es typedef'ed a int *. –
¿Qué pasa con los miembros del tipo POD y POD? –
struct A {~ A() {} int a; }; es un tipo no pod. Si usted mismo hubiera introducido un constructor, entonces el valor de "a" depende de lo que haga ese constructor, por supuesto. –