Подтвердить что ты не робот

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

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

Мой компилятор не жалуется на назначение временной ссылки const:

string foo() {
  return string("123");
};

int main() {
  const string& val = foo();
  printf("%s\n", val.c_str());
  return 0;
}

Почему? Я думал, что строка, возвращаемая из foo, является временной, и val может указывать на объект, срок жизни которого завершен. Предоставляет ли стандарт С++ это и продлевает срок службы возвращаемого объекта?

4b9b3361

Ответ 1

Это функция С++. Код действителен и делает именно то, что он делает.

Обычно временный объект длится только до конца полного выражения, в котором он появляется. Тем не менее, С++ преднамеренно указывает, что привязка временного объекта к ссылке на const в стеке удлиняет время жизни временного ресурса самой ссылки и, таким образом, позволяет избежать того, что в противном случае было бы общей ошибкой оборванных ссылок. В приведенном выше примере временное значение, возвращаемое foo(), сохраняется до закрытия фигурной скобки.

P.S: Это относится только к ссылкам на стек. Он не работает для ссылок, являющихся членами объектов.

Полный текст: GotW # 88: Кандидат на "Самый важный const" Херба Саттера.