estaba leyendo estos dos párrafos del FDIS (12.2p {4,5}):Cuando se crea una matriz mediante una subexpresión, ¿qué ocurre con los temporales en ella?
Hay dos contextos en los que los temporales se destruyen en un punto diferente que el final de la expresión completa. El primer contexto es cuando se llama a un constructor predeterminado para inicializar un elemento de una matriz. Si el constructor tiene uno o más argumentos predeterminados, la destrucción de cada temporal creado en un argumento predeterminado se secuencia antes de la construcción del siguiente elemento de matriz, si lo hay.
y
El segundo contexto es cuando una referencia está unido a un temporal. El temporal a la que se une la referencia o el temporal que es el objeto completo de un subobjeto a la que la referencia está obligado persiste durante toda la vida de la referencia excepto: [...]
- A temporal unido a un parámetro de referencia en una llamada de función (5.2.2) persiste hasta la finalización de la expresión completa que contiene la llamada.
Estos dos dos parecen contradecir para el siguiente caso
struct A {
A() { std::cout << "C" << std::endl; }
~A() { std::cout << "D" << std::endl; }
};
struct B {
B(A const& a = A()) { }
};
typedef B array[2];
int main() {
array{};
}
Will esta salida CDCD
como es requerido por el primer contexto, o se esta salida CCDD
como es requerido por la segunda contexto? GCC parece seguir la segunda descripción de contexto y salidas CCDD
. ¿He pasado por alto algo importante?
EDIT: No creo que necesite C++ 0x. Este new
-expresión se ve afectada también por mi pregunta:
new array(); /* CDCD or CCDD ?? */
En este caso, sin embargo, GCC sigue el primer contexto y salidas CDCD
.
Informó, con la esperanza de que algunos comentarios de los desarrolladores de GCC en él: http://gcc.gnu.org/bugzilla/show_bug.cgi?id= 49372 –
Extraño: mi GCC 4.6 no genera nada. - ah, veo que tienes el mismo comportamiento aparentemente incorrecto :) Por lo que vale: MSVS2010 SP1 saca CDCD ... – rubenvb
También: 8.5.4/4 parece implicar que * normalmente * no hay restricciones de secuencia en los argumentos de una llamada. ¿Es relevante aquí, porque el caso 'new array()' en GCC imprime 'CDCD'? – rubenvb