2012-02-06 9 views
16

En¿Esta referencia temporal sobrevive el tiempo suficiente?

template <typename T> 
T const & foo(T const & dflt) 
    { return /* ... */ ? /* ... */ : dflt; } 

int x = foo(5); 

¿La referencia a temporal "sobrevivir" hasta que se asigna a x?

(sé que sobrevive a la duración de la llamada foo(), pero la tarea que me hace dudar)

El código en cuestión tiene algunos usos legítimos para confiar en las referencias const aquí, es decir, que necesitaría dos por separado funciones

T const & foo_cr(T const & dflt); 
T const & foo_v(T dflt); 

la que quiero evitar (sólo confiar en diferentes firmas wiht el mismo nombre parece un poco arriesgado para mí.)

+0

¿Qué significa '...? ...: dflt; 'que se supone que significa? 0_o –

+1

'...' en este contexto es "código que es irrelevante para la pregunta. Lo he cambiado a comentarios, tal vez eso esté más claro. – peterchen

Respuesta

14

¿la referencia a temporal "sobreviven" u ¿Hasta que esté asignado 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 aplicación introduce un objeto temporal de una clase que tiene un constructor no trivial (12.1), se asegurará de que un constructor se llama para el objeto temporal. Del mismo modo, se llamará al destructor para un temporal con un destructor no trivial (12.4). Los objetos temporales se destruyen como el último paso en al 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 arrojando 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 ... que dejó afuera, pero supongo que no estaba preguntando sobre esto.

+7

Actualmente no se especifica que la tienda a" x "es parte de la totalidad expresión. Consulte http://llvm.org/bugs/show_bug.cgi?id=9783, sin embargo, tanto el comité como los usuarios (con suerte) lo desean. Pero, independientemente de eso, ya está especificado por la especificación de que el * read * de la referencia devuelta por 'foo' (lvalue-to-rvalue) es parte de la expresión completa. Consulte 1.9p10 y su ejemplo final. –

+0

¡Gracias por la respuesta rápida! Sí, el ... caso es seguro. excluido (referencia a un elemento de una colección pasada por referencia como parámetro adicional) – peterchen

Cuestiones relacionadas