При создании нового экземпляра a MyClass
как аргумент функции как так:
class MyClass
{
MyClass(int a);
};
myFunction(MyClass(42));
Стандарт делает какие-либо гарантии на синхронизации деструктора?
А именно, могу я предполагать, что это будет названным перед следующим оператором после вызова к myFunction()
?
Временные объекты уничтожаются в конце полного выражения, частью которого они являются.
Полное выражение - это выражение, которое не является подвыражением какого-либо другого выражения. Обычно это означает, что он заканчивается на ;
(или )
для if
, while
, switch
и т. Д.) обозначающий конец высказывания. В вашем примере это конец вызова функции.
Обратите внимание, что вы можете продлить время жизни временных файлов, привязав их к ссылке const
. Это продлевает их время жизни до времени существования ссылки:
MyClass getMyClass();
{
const MyClass& r = getMyClass(); // full expression ends here
...
} // object returned by getMyClass() is destroyed here
Если вы не планируете изменять возвращаемый объект, тогда это хороший трюк для сохранения вызова конструктора копирования (по сравнению с MyClass obj = getMyClass ();
), если оптимизация возвращаемого значения не применялась. К сожалению, это не очень хорошо известно. (Я полагаю, семантика перемещения C ++ 11 сделает его менее полезным.)
В разделе 12.2, Временные объекты, пункт 3, стандарт ANSI / ISO C гласит: «... Временные объекты уничтожаются на последнем этапе оценки полное выражение, которое (лексически) содержит точку, в которой они были созданы ».
Это тесно связано с концепцией точек последовательности . При достижении точки последовательности все побочные эффекты выражений гарантированно имеют место.
Стандарт действительно предлагает гарантии - из раздела 12.2 / 5:
Временная привязка к параметру ссылки в вызове функции (5.2.2) сохраняется до завершения полное выражение , содержащее вызов
Однако в вашем коде не ясно, передается ли параметр по ссылке или по значению, хотя в какой-то момент будет использоваться конструктор копирования, который принимает ссылку .
Все правильно процитировали 12.2 / 3 или аналогичные, что отвечает на ваш вопрос:
Временные объекты уничтожаются как последний шаг в оценке {{1 }} полное выражение, которое (лексически) содержит точку, в которой они были созданы.
Мне кажется забавным, что на следующей странице в моей печати стандарта 12.2 / 4 говорит:
Есть два контекста, в которых временные объекты уничтожаются в { {1}} точка, отличная от конца полного выражения .
Ни один из них не относится к вашему примеру, они оба относятся к использованию временных файлов в инициализаторах. Но это действительно показывает, что вы должны быть внимательны, когда имеете дело с хитрым зверем вроде стандарта C ++.