Ссылка на возвращаемое значение функции

Я запутался, гарантированно ли в следующем фрагменте foo действительность, т. е. разрешено ли мне хранить возвращаемые значения функции в виде константных ссылок?

Я спрашиваю, потому что возвращаемое значение хранится в кадре стека, что может быть недействительным вскоре после того, как значение было возвращено.

Foo getFoo() {
   return Foo();
}

void bar() {
  const auto& foo = getFoo();

  // more function calls...

  // is foo guaranteed to be valid?
}

person user695652    schedule 17.10.2016    source источник
comment
Да, это действительно.   -  person Edgar Rokjān    schedule 17.10.2016
comment
Я хотел подчеркнуть другую сторону вопроса. Тот, который помечен как дубликат, и ссылка Херба Саттера на самом деле не касаются перспективы памяти. Мне действительно любопытно, почему указанный объект не перезаписывается при выделении новых кадров стека.   -  person user695652    schedule 17.10.2016
comment
Я полагаю, что это функция, определяемая реализацией.   -  person Edgar Rokjān    schedule 17.10.2016
comment
@ user695652: Желание понять, как это работает, — это другой вопрос (на который, возможно, уже был дан ответ); после проверки, задавался ли он уже (советую использовать гугл для поиска ТАК, намного лучше, чем внутренний поисковик), а если нет, то можете задать вопрос. Обратите внимание, что стандарт определяет только то, как вещи должны вести себя, а не то, как они реализованы, поэтому, если вы имеете в виду конкретную цепочку инструментов, вы можете указать ее на случай, если разные цепочки инструментов используют разные стратегии.   -  person Matthieu M.    schedule 18.10.2016


Ответы (1)


Это действительный C++, однако имейте в виду, что некоторые компиляторы (например, Visual Studio 2015, насколько мне известно) не реализуют его должным образом.

По стандарту (N4140):

12.2 Временные объекты
....

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

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

(некоторые исключения)

person AlexD    schedule 17.10.2016