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 является ссылкой на запись в записи цикла. ?? Правильно ли это рассуждение? Если нет, почему бы и нет?

2 Solutions collect form web for “C ++ 11: Оператор на основе диапазона: срок действия «range-init»?”

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

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

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

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

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

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

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

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

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

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

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

  • Как реализовать многопоточный безопасный синглтон в C ++ 11 без использования
  • Что такое nullptr?
  • Могут ли виртуальные функции иметь параметры по умолчанию?
  • Как реализована функция std :: function?
  • Список инициализаторов C ++ 11 сбой - но только в списках длины 2
  • Удобное объявление строк времени компиляции в C ++
  • Что такое «непосредственный контекст», упомянутый в стандарте C ++ 11, для которого применяется SFINAE?
  • Каковы различия между C-like, конструктором и равномерной инициализацией?
  • Как я могу сортировать два вектора одинаково, с критериями, которые используют только один из векторов?
  • to_string не является членом std, говорит g ++ (mingw)
  • Как создать события таймера с помощью C ++ 11?
  • Interesting Posts

    Может ли RDP зеркально отображать / теневую сессию локальной консоли? (Re: Win7, RDP и HTPC)

    Как получить hash MD5 файла на C ++?

    Оператор обновления с внутренним соединением в Oracle

    Как исключить {{{…}}} в flyspell-mode и flyspell-buffer?

    Как использовать git bisect?

    Как работает трансляция сетевых адресов (NAT) на домашнем маршрутизаторе?

    Есть ли что-то вроде «универсального приемника 2,4 ГГц» для беспроводных периферийных устройств?

    Excel VBA Performance – 1 миллион строк – удаление строк, содержащих значение, менее чем за 1 минуту

    История удаленных программ в Windows 7

    NoClassDefFoundError в Java: com / google / common / base / Function

    Как преобразовать Блестящее приложение, состоящее из нескольких файлов, в легкоansible и воспроизводимый пример Shiny?

    Что такое формат ANSI?

    Эффективно загружайте большой коврик в память в OpenCV

    Могу ли я перенести лицензию Windows 8 на мой ноутбук на мой рабочий стол?

    Какой самый простой способ отключить сенсорную панель на ноутбуке?

    Давайте будем гением компьютера.