2015-05-29 1 views
3

я могу сделать что-то вроде этого:Срок службы временного прошел через функцию по ссылке

const int &i = 5; 

и имеют срок службы временно продлен до жизни i.

Но как насчет

const int &fun (const int &i){ 
    return i; 
} 

int main() { 
    const int &r = fun(5); 
    // Can I use r here? 
} 

Является ли срок службы прокси-5 по-прежнему распространяется? Или r болтливая ссылка?

+0

5 является Rvalue. Функция создаст для вас временную, но затем удалит ее после завершения функции. Так что да, это болтливая ссылка. –

+0

Возможный почти дубликат http://stackoverflow.com/q/14735630/560648 –

+0

@LightnessRacesinOrbit Почему «почти»? – Barry

ответ

5

Это болтливая ссылка. Из [class.temporary]/4-5:

Существует два контекста, в которых временные объекты уничтожаются в другой точке, чем конец fullexpression. Первый контекст, когда конструктор по умолчанию называется [...]

Второй контекст - это когда ссылка привязана к временному. Временный, к которому ссылка связанных или временного, что является полным объектом подобъекта, к которому ссылка неизбежно сохраняется в течение всего срока ссылки, за исключением:

  • Временных связанным с опорным элементом в -инициализатор т е р конструктор по [...]
  • временная граница с опорным параметром в вызове функции (5.2.2) не сохраняется до завершения полного-экспрессии, содержащий вызов.
  • [...]

5 сохраняется до завершения полного выражения, не содержащее вызов, который должен сказать:

const int &r = fun(5); 
// <== no more 5 
4

Нет, я так не верю. Вы связали 5 с ссылкой, это аргумент fun, поэтому он длится до тех пор, пока продолжается этот аргумент. Аргумент сохраняется только на время вызова fun.

Соответствующий стандартный текст был изучен в this previous question.

Смежные вопросы