Что происходит при создании массива с помощью подвыражения?

Я читал эти два абзаца 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 . Я упустил из виду что-то важное?


РЕДАКТИРОВАТЬ: Я не думаю, что ему нужен C ++ 0x. На это новое -выражение также влияет мой вопрос:

new array(); /* CDCD or CCDD ?? */

Однако в этом случае GCC следует первому контексту и выводит CDCD .

18
задан Johannes Schaub - litb 3 October 2011 в 13:11
поделиться