C ++ 11: Оператор на основе диапазона: срок действия «range-init»?

В последнем стандарте C ++ это подразумевает, что:

for (foo : bar) baz; 

эквивалентно:

 { auto && r = bar; for ( auto it = r.begin(), end = r.end(); it != end; ++it ) { foo = *it; baz; } } 

Когда в приведенном выше столбце отображается вызов функции, который возвращает коллекцию, например:

 vector boo(); 

т.е.

 for (auto bo : boo()) ... 

Не становится ли линия:

 auto&& r = boo(); ... 

И поэтому временное возвращаемое значение boo () уничтожается в конце инструкции «auto && r = boo ()», а затем r является ссылкой на запись в записи цикла. ?? Правильно ли это рассуждение? Если нет, почему бы и нет?

Правильно ли это рассуждение? Если нет, почему бы и нет?

Это верно до этого момента:

И поэтому временное возвращаемое значение boo () уничтожается в конце инструкции «auto && r = boo ()» […]

Привязка временного к эталону продлевает срок его службы по сравнению с эталоном. Таким образом, временное время сохраняется для всего цикла (поэтому также существует дополнительный набор {} вокруг всей конструкции: правильно ограничить время жизни этого временного).

Это соответствует пункту 5 §12.2 стандарта C ++:

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

[различные исключения, которые здесь не применяются]

Это интересное свойство, которое позволяет злоупотреблять циклом диапазона для недиапазонных объектов: http://ideone.com/QAXNf

Неправильное рассуждение, потому что boo возвращает временный объект по значению. Привязывание этого временного объекта к ссылке означает, что время жизни временного расширения. Стандартная цитата (§ 12.2 / 5):

[…] Временная привязка ссылки или временное, являющееся полным объектом подобъекта, к которому привязана ссылка, сохраняется для времени жизни ссылки […]

Логика будет правильной, если boo ссылку. Примером выражения, возвращающего ссылку на временный, является string("a") += string("b") ; использование этого значения в цикле, основанном for диапазоне, приводит к неопределенному поведению.

  • Настройка переключателей компилятора GCC в Qt, QtCreator и QMake
  • C ++ 11 auto: что, если он получает постоянную ссылку?
  • Реализация операторов сравнения через «tuple» и «tie» - хорошая идея?
  • Как завершить stream в C ++ 11?
  • Получить статус std :: future
  • Должен ли я использовать shared_ptr или unique_ptr
  • Разница между std :: system_clock и std :: stable_clock?
  • Смешивание атома C ++ 11 и OpenMP
  • Возможно ли «сохранить» пакет параметров шаблона без его расширения?
  • 😃 (и другие символы Unicode) в идентификаторах, недопустимых g ++
  • В чем разница между «typedef» и «use» в C ++ 11?
  • Давайте будем гением компьютера.