C++: Продолжительность жизни временных аргументов?

При создании нового экземпляра a MyClass как аргумент функции как так:

class MyClass
{
  MyClass(int a);
};    

myFunction(MyClass(42));

Стандарт делает какие-либо гарантии на синхронизации деструктора?

А именно, могу я предполагать, что это будет названным перед следующим оператором после вызова к myFunction() ?

65
задан Toby Speight 12 November 2019 в 19:33
поделиться

4 ответа

Временные объекты уничтожаются в конце полного выражения, частью которого они являются.

Полное выражение - это выражение, которое не является подвыражением какого-либо другого выражения. Обычно это означает, что он заканчивается на ; (или ) для 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 сделает его менее полезным.)

106
ответ дан 24 November 2019 в 15:21
поделиться

В разделе 12.2, Временные объекты, пункт 3, стандарт ANSI / ISO C гласит: «... Временные объекты уничтожаются на последнем этапе оценки полное выражение, которое (лексически) содержит точку, в которой они были созданы ».

Это тесно связано с концепцией точек последовательности . При достижении точки последовательности все побочные эффекты выражений гарантированно имеют место.

3
ответ дан 24 November 2019 в 15:21
поделиться

Стандарт действительно предлагает гарантии - из раздела 12.2 / 5:

Временная привязка к параметру ссылки в вызове функции (5.2.2) сохраняется до завершения полное выражение , содержащее вызов

Однако в вашем коде не ясно, передается ли параметр по ссылке или по значению, хотя в какой-то момент будет использоваться конструктор копирования, который принимает ссылку .

10
ответ дан 24 November 2019 в 15:21
поделиться

Все правильно процитировали 12.2 / 3 или аналогичные, что отвечает на ваш вопрос:

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

Мне кажется забавным, что на следующей странице в моей печати стандарта 12.2 / 4 говорит:

Есть два контекста, в которых временные объекты уничтожаются в { {1}} точка, отличная от конца полного выражения .

Ни один из них не относится к вашему примеру, они оба относятся к использованию временных файлов в инициализаторах. Но это действительно показывает, что вы должны быть внимательны, когда имеете дело с хитрым зверем вроде стандарта C ++.

24
ответ дан 24 November 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: