Подтвердить что ты не робот

Когда массив создается подвыражением, что происходит с временными в нем?

Я читал эти два параграфа 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.

4b9b3361

Ответ 1

Я не думаю, что есть противоречие.

5.2.2 ясно говорит, что такое вызов функции. Вызов функции - это постфиксное выражение, за которым следуют скобки содержащий, возможно, список выражений, разделенных запятыми которые составляют аргументы функция.

Кажется, что нет функции вызова B::B(A const&) в любом месте вашей программы, поэтому я не вижу, как применяется второй проход.

ИЗМЕНИТЬ вышеуказанное, вероятно, неверно, учитывая 1.9p10 и т.д.