Временное продление жизни

Раздел 12.2.5 стандарта гласит:

Временная граница с опорным параметром в вызове функции (5.2.2)
сохраняется до завершения полного выражения, содержащего
вызов. Временная привязка к возвращаемому значению в функции return
Оператор (6.6.3) сохраняется до выхода из функции. Во всех этих
случаев, временных, созданных во время оценки выражения
инициализация ссылки, кроме временной, к которой
ссылка связана, уничтожается в конце полного выражения в
которые они созданы и в обратном порядке завершения
их конструкция.

Код, который я пытаюсь понять:

#include <iostream>

const int& foo(const int& fooRef)
{
return fooRef;
}                                        // #0

int main (void)
{
const int& numberRef = foo(5);     // #1
std::cout << numberRef;            // #2
return 0;
}

Онлайн #1 временный объект создан и привязан к fooRef параметр foo, fooRef уничтожен на линии #0, Так что я подумал, что временное должно быть уничтожено здесь, поскольку продление жизни не является транзитивным.

Вопросы:

  1. Что значит until the function exits имею в виду? Значит ли это untill it finished executing?

  2. Почему я получаю 5 выход. Временный объект все еще существует на линии #2?

  3. Как я могу интерпретировать стандартную цитату, чтобы понять, как работает этот пример?

Пошаговая пошаговая проработка атомных ссылок со стандартом будет принята с благодарностью. Спасибо!

П. С. Принятый ответ Вот также сказал код broken и я не понимаю, почему я получаю такой вывод программы.

8

Решение

Что значит до выхода из функции? Означает ли это, пока не закончится выполнение?

Да.

Почему я получаю 5 выходных. Временный объект все еще существует в строке # 2?

Разыменование ссылки, которая не связана с живым объектом, неопределенное поведение, так что вы можете получить 5 так же как 42 как и все остальное (включая аварию). Вы просто не можете ожидать каких-либо ожиданий от программы с неопределенным поведением.

Как я могу интерпретировать стандартную цитату, чтобы понять, как работает этот пример?

В значительной степени, как вы уже сделали. Временная привязка к параметру функции fooRef, который уничтожается при возврате из функции. Поскольку этот временный объект связан с возвращаемым значением, этот объект перестает существовать, когда функция возвращается. Позже вы разыменовываете свисающую ссылку, которая дает вам UB.

3

Другие решения

  1. Это означает, что до закрывающей скобки, т.е. },

  2. Вы вызвали UB, у вас есть свисающая ссылка.

Попробуйте следующую модификацию вашего кода и посмотрите, что он печатает. Это вероятно напечатает 6 потому что это то, что было последним в стеке. Или попробуйте передать std::string вместо этого вы можете получить сбой.

int main (void)
{
const int& numberRef = foo(5);
foo(6);
std::cout << numberRef;
return 0;
}
1

По вопросам рекламы [email protected]