2010-07-06 18 views
7

¿Me podría decir si tal código es correcto (según la norma):vida temporal constante C++

struct array { 
    int data[4]; 
    operator const int*() const { return data; } 
}; 

void function(const int*) { ... } 

function(array()); // is array data valid inside function? 

Gracias

+3

@Martin Sí, quería estar seguro de que es una coincidencia válida en lugar de una suerte de compilador. Sé acerca de la vida útil de los objetos, pero no estaba seguro de que el reparto de objetos como este – Anycorn

+0

sea muy inteligente. Como regla general, generalmente se puede esperar que, si se puede verificar o aplicar algo en tiempo de compilación, entonces lo será. El comportamiento indefinido generalmente se produce cuando se necesita una verificación de tiempo de ejecución para evitarlo. Pero, como dices, siempre es mejor asegurarte. –

Respuesta

12

Sí. El objeto temporal es válido hasta el final de la expresión completa en la que se crea; es decir, hasta después de que la llamada de función regrese.

No tengo mi copia del estándar a mano, así que no puedo dar la referencia exacta; pero está en 12.2 del C++0x final draft.

+1

También es 12.2 en C++ 98. –

6

Sí. Los temporarios son válidos hasta el final de la expresión completa en la que se crean. Por lo tanto, la matriz anónima temporal sería válida hasta que regrese la llamada a function, por lo que su miembro data también lo será.