Это приводит к неопределенному поведению относительно времени жизни объекта? - PullRequest
2 голосов
/ 20 апреля 2011
#include "stdio.h"

class C {
 public:
  ~C() { printf("~C\n"); }
};

int I(const C& c) { printf("I\n"); return 0; }
void V(int i) { printf("V\n"); }

int main() {
  V(I(C()));
  return 0;
}

Видимый вывод:

I
V
~C

что бы я ожидал:

I
~C
V

Ответы [ 4 ]

4 голосов
/ 20 апреля 2011
V(I(C()));

C() создает временное значение, которое сохраняется до завершения полного выражения , а завершение выражения full равно ; (то есть точка с запятой),Вот почему вы видите, что вывод, который, на мой взгляд, является четко определенным.

В разделе §12.2 / 3 из Стандартных прочтений

[...] Временные объекты уничтожено как последний шаг в оценке полного выражения (1.9), которое (лексически) содержит точку, где они были созданы.Это верно даже в том случае, если эта оценка заканчивается генерацией исключения.

Просто чтобы подчеркнуть, что в этом примере время жизни временного элемента не имеет ничего общего с ссылкой или * 1020.* const reference параметр функции I().Даже если подпись I():

int I(C c); //instead of : int I(const C & c);

, временное хранилище будет сохраняться до завершения выражения full , и вы увидите точно того же вывода.

См. http://www.ideone.com/RYWhy

3 голосов
/ 20 апреля 2011

Вызов V возвращается до того, как полное выражение будет полностью оценено.И когда V вернется, он напечатает свои вещи (перед возвращением из V есть точка последовательности).

Временный C() уничтожается только после оценки полного полного выражения.

1 голос
/ 20 апреля 2011

Поведение, которое вы видите, является предписанным стандартом: временные уничтожаются в конце полного выражения, создающего их.

Исторически было замечено другое поведение (которое все еще доступно в некоторых компиляторах): уничтожение в конце блока. В вашем случае это не имело бы значения, поскольку еще больше затягивало разрушение.

1 голос
/ 20 апреля 2011

Почему? Временная жизнь до конца полного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...