Я читал эти два параграфа FDIS (12.2p {4,5}):
Существует два контекста, в которых временные объекты уничтожаются в другой точке, чем конец полного выражения. Первый контекст - это когда конструктор по умолчанию вызывается для инициализации элемента массива. Если конструктор имеет один или несколько аргументов по умолчанию, уничтожение каждого временного объекта, созданного в аргументе по умолчанию, секвенируется перед построением следующего элемента массива, если он есть.
и
Второй контекст - это когда привязка привязана к временному. Временное, к которому привязана ссылка, или временное, являющееся полным объектом подобъекта, к которому привязана ссылка, сохраняется для ресурса ссылки, за исключением: [...]
- Временная привязка к ссылочному параметру в вызове функции (5.2.2) сохраняется до завершения полного выражения, содержащего вызов.
Эти два двое, по-видимому, противоречат следующему случаю
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
соответствовать первому контексту или будет выводиться CCDD
, как того требует второй контекст? Кажется, что GCC соответствует второму описанию контекста и выводит CCDD
. Упустил ли я что-то важное?
EDIT: я не думаю, что ему нужен С++ 0x. Это выражение new
также зависит от моего вопроса:
new array(); /* CDCD or CCDD ?? */
В этом случае GCC следует за первым контекстом и выводит CDCD
.