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