Каково время жизни временных аргументов во вложенных вызовах функций?C++

Программы на C++. Форум разработчиков
Ответить
Гость
 Каково время жизни временных аргументов во вложенных вызовах функций?

Сообщение Гость »


Рассмотрим программу:

Код: Выделить всё

#include 
#include 

struct X
{
std::string tag;

~X() { std::println("X::~X() - {}", tag); }
};

X f(const X& x) {
std::println("f() - {}", x.tag);
return {x.tag + "!"};
}

int main() {
f(f({"x"}));
}
Для соответствующего компилятора C++(23) правильно ли я предположу следующий вывод:

Код: Выделить всё

f() - x
f() - x!
X::~X() - x!!
X::~X() - x!
X::~X() - x
Это означает, что время жизни временных объектов, на которые ссылаются параметры функции, заканчивается после выполнения полного выражения (1), а временные объекты уничтожаются в обратном порядке. порядок создания (2).
Обратите внимание, что занимает по ссылке. Если бы было объявлено

Код: Выделить всё

X f(X x)
вместо этого, то

Код: Выделить всё

XОбъект 
фактически может быть уничтожен, как только функция вернет значение (3):

Код: Выделить всё

f() - x
X::~X() - x
f() - x!
X::~X() - x!
X::~X() - x!!
I think these are the relevant quotes from the standard:
  • [class.temporary#6.9]
A temporary object bound to a reference parameter in a function call
([expr.call]) persists until the completion of the full-expression
containing the call.
  • [class.temporary#8]
The destruction of a temporary whose lifetime is not extended beyond
the full-expression in which it was created is sequenced before the
destruction of every temporary which is constructed earlier in the
same full-expression.
  • [expr.call#6]
It is implementation-defined whether the lifetime of a parameter ends
when the function in which it is defined returns or at the end of the
enclosing full-expression.


Источник: https://stackoverflow.com/questions/781 ... tion-calls
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»