c++ - Cuando una matriz es creada por una subexpresión, ¿qué sucede con los temporales en ella?
standards c++11 (1)
No creo que haya una contradicción.
5.2.2 dice claramente lo que es una llamada a una función. Una llamada a la función es una expresión de posfijo seguida de paréntesis que contiene una lista de expresiones posiblemente vacía y separada por comas que constituyen los argumentos de la función.
No parece haber una llamada de función a B::B(A const&)
en ningún lugar de su programa, por lo que no veo cómo se aplica el segundo pasaje.
EDITAR lo anterior es probablemente incorrecto, dado 1.9p10 etc.
Estaba leyendo estos dos párrafos del FDIS (12.2p {4,5}):
Hay dos contextos en los que los temporales se destruyen en un punto diferente al 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 la matriz, si corresponde.
y
El segundo contexto es cuando una referencia está vinculada a un temporal. El temporal al que se enlaza la referencia o el temporal que es el objeto completo de un subobjeto al que se enlaza la referencia persiste durante toda la vida útil de la referencia, excepto: [...]
- Un enlace temporal 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{};
}
¿ CDCD
este CDCD
como lo requiere el primer contexto, o este CCDD
como lo requiere el segundo contexto? GCC parece seguir la segunda descripción de contexto y genera CCDD
. ¿He pasado por alto algo importante?
EDIT: No creo que necesite C ++ 0x. Esta new
expresión también se ve afectada por mi pregunta:
new array(); /* CDCD or CCDD ?? */
En este caso, sin embargo, GCC sigue el primer contexto y genera CDCD
.