2016-10-17 11 views
0

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

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

Foo getFoo() { 
    return Foo(); 
} 

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

    // more function calls... 

    // is foo guaranteed to be valid? 
} 
+1

Да, это действительно. –

+0

Я хотел подчеркнуть другой аспект вопроса. Тот, который обозначен как дубликат, и ссылка Херба Саттера действительно не адресуют перспективы памяти. Мне очень любопытно, почему ссылочный объект не получает перезапись при назначении новых стековых кадров. – user695652

+0

Я полагаю, что это определенная реализация. –

ответ

1

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

В соответствии со стандартом (N4140):

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

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

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

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