Возврат временного объекта и привязка к константной ссылке
Возможный дубликат:
Продлевает ли константная ссылка временную жизнь?
Мой компилятор не жалуется на назначение временной ссылки на const:
string foo() {
return string("123");
};
int main() {
const string& val = foo();
printf("%s\n", val.c_str());
return 0;
}
Зачем? Я думал, что строка вернулась из foo
является временным, и val может указывать на объект, срок жизни которого истек. Допускает ли это стандарт C++ и продлевает время жизни возвращаемого объекта?
1 ответ
Это особенность C++. Код действителен и делает именно то, что кажется.
Обычно временный объект длится только до конца полного выражения, в котором он появляется. Тем не менее, C++ намеренно указывает, что привязка временного объекта к ссылке на const в стеке удлиняет время жизни временного объекта до времени жизни самой ссылки и, таким образом, позволяет избежать того, что в противном случае было бы распространенной ошибкой висячих ссылок. В приведенном выше примере временное возвращение foo()
живет до закрывающей фигурной скобки.
PS: это относится только к стековым ссылкам. Это не работает для ссылок, которые являются членами объектов.
Полный текст: ПОЛУЧИЛСЯ № 88: Кандидат на "Самый важный конст" Херба Саттера.