Ответ 1
Когда и если вы должны использовать auto&&
in для циклов, здесь было очень хорошо объяснено Howard Hinnant.
Это оставляет вопрос о том, что 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&&