В чем преимущество использования универсальных ссылок в диапазонах для циклов?

const auto& будет достаточным, если я хочу выполнять операции только для чтения. Однако я столкнулся с

 for (auto&& e : v) // v is non-const 

пару раз недавно. Это заставляет меня задаться вопросом:

Возможно ли, что в некоторых случаях с неясными углами есть преимущество в производительности при использовании универсальных ссылок, по сравнению с auto& или const auto& ?

( shared_ptr является подозреваемым в неясных случаях)


Обновление Два примера, которые я нашел в своих избранных:

Любой недостаток использования ссылки const при итерации по базовым типам?
Могу ли я легко перебирать значения карты с использованием цикла, основанного на диапазоне?

Пожалуйста, сосредоточьтесь на вопросе: почему я хотел бы использовать auto && в диапазонах для циклов?

Единственное преимущество, которое я вижу, – это когда iterator последовательности возвращает ссылку на прокси-сервер, и вам нужно работать с этой ссылкой неконстантным способом. Например, рассмотрим:

 #include  int main() { std::vector v(10); for (auto& e : v) e = true; } 

Это не компилируется, потому что rvalue vector::reference возвращаемый из iterator , не будет связываться с ссылкой на константу lvalue. Но это будет работать:

 #include  int main() { std::vector v(10); for (auto&& e : v) e = true; } 

Все, что было сказано, я бы не закодировал этот путь, если вы не знали, что вам нужно удовлетворить такой прецедент. Т.е. я бы не сделал это безвозмездно, потому что это заставляет людей задаваться вопросом, что вы делаете. И если бы я это сделал, было бы неловко включать комментарий о том, почему:

 #include  int main() { std::vector v(10); // using auto&& so that I can handle the rvalue reference // returned for the vector case for (auto&& e : v) e = true; } 

редактировать

Этот последний мой случай действительно должен быть шаблоном, чтобы иметь смысл. Если вы знаете, что цикл всегда обрабатывает ссылку на прокси-сервер, тогда auto будет работать auto , а также auto&& . Но когда цикл иногда обрабатывал ссылки без прокси-сервера, а иногда и прокси-ссылки, я думаю, что auto&& станет выбором.

Использование auto&& или универсальных ссылок с диапазоном for -loop имеет то преимущество, что вы фиксируете то, что получаете. Для большинства типов iteratorов вы, вероятно, получите либо T& либо T const& для некоторого типа T Интересным случаем является то, что разыменование iteratorа приводит к временному: C ++ 2011 получил расслабленные требования, и iteratorы не обязательно должны давать lvalue. Использование универсальных ссылок соответствует пересылке аргументов в std::for_each() :

 template  F std::for_each(InIt it, InIt end, F f) { for (; it != end; ++it) { f(*it); // <---------------------- here } return f; } 

Функциональный объект f может обрабатывать T& , T const& и T разному. Почему тело диапазона, основанного for -loop, будет отличаться? Конечно, чтобы на самом деле воспользоваться выводом типа с использованием универсальных ссылок, вам нужно было бы передать их соответственно:

 for (auto&& x: range) { f(std::forward(x)); } 

Конечно, использование std::forward() означает, что вы принимаете любые возвращаемые значения, которые нужно перенести из. Являются ли такие объекты похожими на код без шаблона, я не знаю (пока?). Я могу себе представить, что использование универсальных ссылок может предоставить компилятору больше информации о том, как делать правильную вещь. В шаблоном коде он не принимает решения о том, что должно произойти с объектами.

Я практически всегда использую auto&& . Зачем укусить кромку, когда вам это не нужно? Короче набирать шрифт, и я просто нахожу его более … прозрачным. Когда вы используете auto&& x , вы знаете, что x – это точно *it , каждый раз.

  • Каков самый быстрый способ чтения текстового файла по очереди?
  • Внедряет ли Java кастинг накладные расходы? Зачем?
  • Относительная производительность std :: vector vs. std :: list vs. std :: slist?
  • Использование различных типов SSD (не только SATA-based) в качестве системного диска
  • .EACHI в data.table?
  • Если профайлер не является ответом, какие у нас есть другие варианты?
  • Должен ли я использовать String.format () Java, если производительность важна?
  • Самый быстрый способ суммирования целых чисел в текстовом файле
  • Сколько Include я могу использовать в ObjectSet в EntityFramework для сохранения производительности?
  • Почему Java-переключатель на непрерывных ints работает быстрее с добавленными случаями?
  • Почему определение classа как окончательного улучшает производительность JVM?
  • Interesting Posts

    WIndows 7 не может загружаться – bootrec отчеты FS не найдены или не повреждены

    Как изменить цвет синей подсветки в раскрывающемся списке выбора windows

    Общая библиотека C ++ с шаблонами: ошибка неопределенных символов

    Нужно простое шифрование файлов для неквалифицированных пользователей Mac и Windows

    Я думаю, что кто-то еще имеет доступ к моей беспроводной сети. Что дальше?

    Библиотека FFT в android Sdk

    Получение сообщения консоли: ipc_kmsg_copyout_header: невозможно увеличить пространство пользователя ipc. Любые Mac-серверы Mac OS X здесь?

    ListView в ArrayAdapter order get смешивается при прокрутке

    Есть ли простой способ вернуть строку, повторенную X раз?

    Вычислить отличие от предыдущего элемента с LINQ

    Преобразование & amp; to & in Objective-C

    Как автоматически войти в систему после сна

    Является ли LIKE-оператор чувствительным к регистру с сервером MSSQL?

    Как UISelectOne и UISelectMany компоненты предварительно выбирают значения по умолчанию в f: selectItems

    Как параметры отправляются в HTTP-запрос POST?

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