2011-04-19 10 views
12

Dado el siguiente código:Lifetime de límite temporal a agregarse inicializa struct miembro de

class foo 
{ 
}; 

class bar: public foo 
{ 
public: 
    ~bar() { printf("~bar()\n"); } 
}; 

class zab: public foo 
{ 
public: 
    ~zab() { printf("~zab()\n"); } 
}; 

struct foo_holder 
{ 
    const foo &f; 
}; 

int main() 
{ 
    foo_holder holder[]= { {bar()}, {zab()} }; 
    printf("done!\n"); 
    return 0; 
} 

la salida es:

~bar() 
~zab() 
done! 

C++ 0x tiene una cláusula que dicta esto puede crear colgando referencias cuando usado como un nuevo inicializador, pero no dice nada (al menos nada que pueda encontrar) sobre la inicialización agregada de las referencias de const con los temporales.

¿Este comportamiento no especificado está entonces?

+0

C++ 11 no existe todavía. Tal vez te estás refiriendo a C++ 0x FDIS. –

+1

@Tomalak, corregido. Lo vi en otro lado y me hizo cosquillas en el cerebro. – MSN

+0

@MSN: suficiente;) –

Respuesta

1

Tengo una respuesta en comp.std.C++:

http://groups.google.com/group/comp.std.c++/msg/9e779c0154d2f21b

Básicamente, la norma no se refiere explícitamente; por lo tanto, debe comportarse igual que una referencia declarada localmente.

+0

Gracias por consultar. Sin embargo, todavía me parece bastante inconsistente: tener referencias que extienden la vida útil en la lista de inicializadores POD, pero no en el inicializador de ctor parece muy extraño. Pero bueno, eso es C++. +1 de mi parte – Vitus

1

No se menciona en la lista de excepciones, por lo tanto, la duración de la vida temporal debe extenderse para que coincida con la duración de (conjunto de) foo_holder s. Sin embargo, esto me parece un descuido, tal vez enviar un Informe de Defectos sea una buena idea.


§12.2/5 estados, que cuando referencia está unido a un temporal, el tiempo de vida de temporal se extiende para que coincida con tiempo de vida de la referencia y porque const foo& f es miembro de foo_holder, la vida útil de la referencia es de por vida a juego de foo_holder, según §3.7.5/1:

La duración de almacenamiento de subobjetos miembros, subobjetos la clase base y elementos de la matriz es el de su objeto completo (1,8).

Esto podría ser poco complicado para interpretar teniendo en cuenta las referencias, ya §3.8/1 estados, que toda la vida de objeto termina cuando el almacenamiento se libera o reutilizado:

El tiempo de vida de un objeto de tipo T termina cuando:

- si T es un tipo de clase con un destructor no trivial (12.4), la llamada destructor comienza, o

- el almacenamiento de la que el objeto ocupa se reutiliza o liberado.

Sin embargo, no se especifica si las referencias usan almacenamiento o no; §8.3.2/4 dice

No se especifica si una referencia requiere o no almacenamiento (3.7).

Quizás alguien con un mejor conocimiento de la norma lo sepa mejor.

Cuestiones relacionadas