Каково время жизни временных аргументов во вложенных вызовах функций?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 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • NullReferenceException в разработке мод с Bepinex для симулятора жизни стримерного жизни 2 [дубликат]
    Anonymous » » в форуме C#
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous
  • S.M.A.R.T Диск Остаток Проценты жизни Процент жизни C#
    Anonymous » » в форуме C#
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • S.M.A.R.T Диск Остаток Проценты жизни Процент жизни C#
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • S.M.A.R.T Диск Остаток Проценты жизни Процент жизни C#
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Каково время жизни лямбда-захвата в C++ [дубликат]
    Anonymous » » в форуме C++
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous

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