Возврат временного объекта и привязка к константной ссылке

Возможный дубликат:
Продлевает ли константная ссылка временную жизнь?

Мой компилятор не жалуется на назначение временной ссылки на 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: Кандидат на "Самый важный конст" Херба Саттера.

Другие вопросы по тегам