2009-05-25 17 views

Respuesta

17

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.

+3

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 *. –

+0

¿Qué pasa con los miembros del tipo POD y POD? –

+0

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. –

2
#include <iostream> 
struct Foo { 
    char bar; 
    char baz; 
    char foobar; 
    // the struct is a POD 
    //virtual void a() { bar='b'; } 
}; 

int main() { 
    Foo o1; 
    Foo o2 = Foo(); 

    std::cout << "O1: " << (int)o1.bar <<" "<< (int)o1.baz <<" "<< (int)o1.foobar << std::endl; 
    std::cout << "O2: " << (int)o2.bar <<" "<< (int)o2.baz <<" "<< (int)o2.foobar << std::endl; 
    return 0; 
} 

Salida:

O1: -27 -98 0

O2: 0 0 0

Adición() se propaga inicializador llama a todos los miembros de la cápsula. Uncomenting el método virtual salida cambia a:

O1: -44 -27 -98

O2: -71 -120 4

Sin embargo la adición de destructor ~ Foo() no suprime la inicialización, aunque crea objetos que no son POD (salida similar a la primera).