Assuming my current rule when programming with range-based loops says
Use
for(auto const &e :...)
orfor(auto &e:...)
when possible overfor(auto a: ...)
.
I base this on my own experience and this question for example.
But after reading about the new terse for loops I wonder, should I not replace my &
in my rule with &&
? As written here this looks like the Meyers' Universal References.
So, I ask myself, should my new rule either be
Use
for(auto const &&e :...)
orfor(auto &&e:...)
when possible ...
or does that not always work and therefore should rather be the quite complicated one
Check if
for(auto const &&e :...)
orfor(auto &&e:...)
is possible, then considerfor(auto const &e :...)
orfor(auto &e:...)
, and only when needed do not use references.
When and if you should use
auto&&
in for loops has been explained very nicely by Howard Hinnant here.This leaves the question what
x
inactually is. And it is handled as if there there were a function template definition
and the type of
x
is deduced by the same rules asu
[§7.1.6.4.(7)].This means it is not handled as a RValue Reference, but as a "Universal/Forwarding Reference" -- the "Reference Collapsing Rules" apply.
This also holds for
as the example in §7.1.6.4.(7) states, at least for
const auto &x
.But, as PiotrS says in the questions comments, any qualifiers nullifies the URef-ness: