Предполагая, что мое текущее правило при программировании с использованием циклов на основе диапазона говорит:
использование
for(auto const &e :...)
или жеfor(auto &e:...)
когда это возможноfor(auto a: ...)
,
Я основываю это на своем собственном опыте и этот вопрос например.
Но после прочтения о новом кратко для петель Интересно, не заменить ли мне &
в моем правлении с &&
? Как написано Вот это выглядит как Универсальные ссылки Мейерса.
Итак, я спрашиваю себя, должно ли мое новое правило быть
использование
for(auto const &&e :...)
или жеfor(auto &&e:...)
когда возможно …
или это не всегда работает и, следовательно, должно быть довольно сложным
Проверить, если
for(auto const &&e :...)
или жеfor(auto &&e:...)
возможно, тогда посмотримfor(auto const &e :...)
или жеfor(auto &e:...)
и только при необходимости не используйте ссылки.
Когда и если вы должны использовать auto&&
в течение цикла было очень хорошо объяснено Говард Хиннант Вот.
Это оставляет вопрос, что x
в
auto &&x = ...expr...
на самом деле И обрабатывается так, как если бы там было определение шаблона функции
template <class U> void f(const U& u);
и тип x
выводится по тем же тулам, что и u
[§7.1.6.4. (7)].
Это означает, что это не обрабатывается как ссылка RValue, но как «универсальная / пересылочная ссылка» — «Правила свертывания ссылок» применять.
Это также верно для
const auto &&x = ...expr...
как показано в §7.1.6.4. (7), по крайней мере, для const auto &x
,
Но, как говорит PiotrS в комментариях к вопросам, любые квалификаторы аннулируют URef-ness:
нет, потому что ни
T
вtemplate<class T> void f(const T&&)
не является ссылкой для пересылки, ниconst auto&&
является. Дело в том, чтоT&&
происходит в объявлении параметра не означает, что это ссылка на пересылку. Только чистыйT&&
без квалификаторов, какconst
или жеvolatile
пересылает ссылку, то естьtemplate<class T> void f(T&&)
или жеauto&&
, и никогдаconst T&&
или constauto&&