Когда массив создается подвыражением, что происходит с временными файлами? - PullRequest
18 голосов
/ 11 июня 2011

Я читал эти два абзаца 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 -выражение тоже влияет мой вопрос:

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

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

1 Ответ

2 голосов
/ 11 июня 2011

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

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

РЕДАКТИРОВАТЬ Выше, вероятно, неправильно, учитывая 1.9p10 и т. д.

...