В подобном коде
#include <iostream> #include <memory> struct A { int i; A() { std::cout << "A()" << std::endl; } ~A() { std::cout << "~A()" << std::endl; } }; void f(const A& a) { std::cout << "f(A)" << std::endl; } std::unique_ptr<A> make_a() { return std::make_unique<A>(); } int main() { f(*make_a()); }
Есть ли гарантия, что объект A будет удален только после выполнения f()?
A
f()
Да, гарантируется, что временный будет уничтожен после полного выражения, которое включает вызов функции f().
Все временные объекты уничтожаютсякак последний шаг в оценке полного выражения, которое (лексически) содержит точку, в которой они были созданы, и, если было создано несколько временных объектов, они уничтожаются в порядке, противоположном порядку создания.Это верно, даже если эта оценка завершается выдачей исключения.
Есть ли гарантия, что объект A будет удален только после выполнения f ()?
Стандарт C ++ гарантирует, что все временные объекты будут жить до тех пор, пока не завершится оценка полное выражение (заканчивающееся точкой с запятой ;).См. Время жизни для получения полной информации:
;
Все временные объекты уничтожаются как последний шаг в оценке полного выражения, которое (лексически) содержит точку, где они были созданы, и еслиСоздано несколько временных объектов, они уничтожаются в порядке, противоположном порядку создания.Это верно, даже если эта оценка завершается выдачей исключения.
Временные объекты уничтожаются, когда полное выражение участвует в концах.
В вашем случае полное выражение равно f(*make_a()), что означает, чтообъект будет уничтожен после завершения вызова f (после возврата функции f).
f(*make_a())
f
Объект будет удален после вычисления полного выражения f(*make_a());
f(*make_a());
Да, это правильно.Стандарт C ++ четко утверждает, что все анонимные временные данные, переданные в качестве параметров функции, выживают при вызове функции.