Возrotation временного объекта и привязка к константной ссылке
Возможный дубликат:
Содержит ли ссылка на константу срок службы временного?
Мой компилятор не жалуется на назначение временной ссылки на const:
string foo() { return string("123"); }; int main() { const string& val = foo(); printf("%s\n", val.c_str()); return 0; }
Зачем? Я думал, что строка, возвращаемая из foo
является временной, а val может указывать на объект, срок жизни которого завершен. Предоставляет ли это стандарт C ++ и продлевает срок службы возвращаемого объекта?
- C ++ 11 auto: что, если он получает постоянную ссылку?
- Что такое «корневая ссылка»?
- Одна ошибка VS2010? Разрешить привязку не-const ссылки на rvalue БЕЗ ДАЖЕ предупреждение?
- Есть ли getchas с использованием varargs со ссылочными параметрами
- Понимание classов ссылок Java: SoftReference, WeakReference и PhantomReference
- Почему «универсальные ссылки» имеют тот же синтаксис, что и ссылки rvalue?
- постоянные ссылки с typedef и шаблонами в c ++
- Как ссылаться на общие classы и методы в XML-документации
- Json и Java - Циркулярная ссылка
- Как обратиться к документации Microsoft.Office.Interop.Excel?
- C ++: ссылка const, перед vs после спецификатора типа
- Java: разница между сильным / мягким / слабым / фантомным ссылкой
- Как скопировать содержимое одного ArrayList в другое?
Это функция C ++. Код действителен и делает то, что он, как представляется, делает.
Обычно временный объект длится только до конца полного выражения, в котором он появляется. Тем не менее, C ++ преднамеренно указывает, что привязка временного объекта к ссылке на const в стеке удлиняет время жизни временного ресурса самой ссылки и, таким образом, позволяет избежать того, что в противном случае было бы общей ошибкой оборванных ссылок. В приведенном выше примере временное значение, возвращаемое foo()
сохраняется до закрывающей фигурной скобки.
PS: Это относится только к ссылкам на стек. Он не работает для ссылок, являющихся членами объектов.
Полный текст: GotW # 88: Кандидат на «Самый важный const» Херба Саттера .