6

12.2.5 часть стандарта говорит:Временное продление времени жизни

Временная граница с опорным параметром в вызове функции (5.2.2) сохраняется до завершения полного выражения не содержащий вызов , Временная привязка к возвращаемому значению в возвращаемой функции (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. Как я могу интерпретировать стандартную цитату, чтобы выяснить, как работает этот пример?

Понятно, что поэтапное проведение атомарного сквозного со ссылками на стандарт. Спасибо!

P. S. Принятый ответ here также сообщил, что код broken, и я не понимаю, почему я получаю такой вывод программы.

ответ

3

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

Да.

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

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

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

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

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

  2. Вы используете UB, у вас есть оборванная ссылка.

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

int main (void) 
{ 
    const int& numberRef = foo(5); 
    foo(6); 
    std::cout << numberRef; 
    return 0; 
} 
Смежные вопросы