Раздел 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
, Так что я подумал, что временное должно быть уничтожено здесь, поскольку продление жизни не является транзитивным.
Вопросы:
Что значит until the function exits
имею в виду? Значит ли это untill it finished executing
?
Почему я получаю 5
выход. Временный объект все еще существует на линии #2
?
Как я могу интерпретировать стандартную цитату, чтобы понять, как работает этот пример?
Пошаговая пошаговая проработка атомных ссылок со стандартом будет принята с благодарностью. Спасибо!
П. С. Принятый ответ Вот также сказал код broken
и я не понимаю, почему я получаю такой вывод программы.
Что значит до выхода из функции? Означает ли это, пока не закончится выполнение?
Да.
Почему я получаю 5 выходных. Временный объект все еще существует в строке # 2?
Разыменование ссылки, которая не связана с живым объектом, неопределенное поведение, так что вы можете получить 5
так же как 42
как и все остальное (включая аварию). Вы просто не можете ожидать каких-либо ожиданий от программы с неопределенным поведением.
Как я могу интерпретировать стандартную цитату, чтобы понять, как работает этот пример?
В значительной степени, как вы уже сделали. Временная привязка к параметру функции fooRef
, который уничтожается при возврате из функции. Поскольку этот временный объект связан с возвращаемым значением, этот объект перестает существовать, когда функция возвращается. Позже вы разыменовываете свисающую ссылку, которая дает вам UB.
Это означает, что до закрывающей скобки, т.е. }
,
Вы вызвали UB, у вас есть свисающая ссылка.
Попробуйте следующую модификацию вашего кода и посмотрите, что он печатает. Это вероятно напечатает 6
потому что это то, что было последним в стеке. Или попробуйте передать std::string
вместо этого вы можете получить сбой.
int main (void)
{
const int& numberRef = foo(5);
foo(6);
std::cout << numberRef;
return 0;
}