c++ - ¿Esta referencia temporal sobrevive lo suficiente?
temporary (1)
¿La referencia a la "supervivencia" temporal hasta que se asigna a x?
En general, sí. Si foo
devuelve dflt
, esa referencia (a un 5 temporal) es válida hasta el final de la expresión completa en la que se creó, es decir, hasta después de la inicialización.
C ++ 03, 12.2 / 3:
Cuando una implementación introduce un objeto temporal de una clase que tiene un constructor no trivial (12.1), se asegurará de que se llame a un constructor para el objeto temporal. De manera similar, se llamará al destructor para un temporal con un destructor no trivial (12.4). Los objetos temporales se destruyen como el último paso para evaluar la expresión completa (1.9) que (léxicamente) contiene el punto donde se crearon. Esto es cierto incluso si esa evaluación termina lanzando una excepción.
Más viene en 12.2 / 4 y 12.2 / 5, especialmente las excepciones de esta regla.
No puedo ver qué sucede cuando devuelve el ...
dejaste afuera, pero supongo que no estabas preguntando sobre esto.
En
template <typename T>
T const & foo(T const & dflt)
{ return /* ... */ ? /* ... */ : dflt; }
int x = foo(5);
¿La referencia a la "supervivencia" temporal hasta que se asigna a x?
(Sé que sobrevive a la duración de la llamada foo (), pero la tarea me hace dudar)
El código en cuestión tiene algunos usos legítimos para confiar en las referencias const aquí, es decir, necesitaría dos funciones separadas
T const & foo_cr(T const & dflt);
T const & foo_v(T dflt);
lo que quiero evitar (solo me parece un poco arriesgado confiar en firmas diferentes con el mismo nombre).