¿Se garantiza que un temporal creado como parte de un argumento de una llamada de función se mantendrá hasta que la función llamada finalice, incluso si el temporal no se pasa directamente a la función?¿Cuándo se crean los temporales creados como parte de una llamada de función destruida?
hay prácticamente ninguna posibilidad de que era coherente, así que aquí está un ejemplo:
class A {
public:
A(int x) : x(x) {printf("Constructed A(%d)\n", x);}
~A() {printf("Destroyed A\n");}
int x;
int* y() {return &x;}
};
void foo(int* bar) {
printf("foo(): %d\n", *bar);
}
int main(int argc, char** argv) {
foo(A(4).y());
}
Si A(4)
fueron pasados directamente a foo
sería definitivamente no será destruido hasta después de la llamada foo
terminó, pero en lugar de eso estoy llamando un método en el temporal y perder cualquier referencia a él. Instintivamente pensaba que el A
temporal se destruiría antes de que foo
incluso se inicie, pero probar con GCC 4.3.4 muestra que no es así; la salida es:
construyó una (4)
foo(): 4
destruyó un
La pregunta es, es el comportamiento de GCC garantizada por la especificación? ¿O se permite a un compilador destruir el A
temporal antes de la llamada al foo
, invalidando el puntero a su miembro que estoy usando?
impresionante Gracias a ti y Jerry para encontrar la referencia en la especificación, que tenía problemas para encontrarlo –