Что означает «авто & amp; & amp; e` делать в диапазонах for-loop?

Предполагая, что мое текущее правило при программировании с использованием циклов на основе диапазона говорит:

использование 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:...)и только при необходимости не используйте ссылки.

24

Решение

Когда и если вы должны использовать 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&& или const auto&&

5

Другие решения


По вопросам рекламы [email protected]