c++ - ¿Qué hace `auto && e` en los bucles de bucles basados en rango?
c++11 for-loop (1)
Suponiendo que mi regla actual al programar con bucles basados en rangos dice
Use
for(auto const &e :...)
ofor(auto &e:...)
cuando sea posible una vez másfor(auto a: ...)
.
Baso esto en mi propia experiencia y en esta pregunta, por ejemplo.
Pero después de leer sobre el nuevo resumen de bucles, me pregunto: ¿no debería reemplazar mi &
en mi regla con &&
? Como está escrito here esto se parece a las Referencias Universales de Meyers .
Entonces, me pregunto, si mi nueva regla es
Use
for(auto const &&e :...)
ofor(auto &&e:...)
cuando sea posible ...
¿O eso no siempre funciona y, por lo tanto, debería ser bastante complicado?
Marque si es posible
for(auto const &&e :...)
ofor(auto &&e:...)
, luego considerefor(auto const &e :...)
ofor(auto &e:...)
, y solo Cuando sea necesario no utilice referencias.
Howard Hinnant ha explicado muy bien cuándo y si debe usar auto&&
in para bucles.
Esto deja la pregunta de qué x
en
auto &&x = ...expr...
en realidad es. Y se maneja como si hubiera una definición de plantilla de función.
template <class U> void f(const U& u);
y el tipo de x
se deduce por los mismos tules que u
[§7.1.6.4. (7)].
Esto significa que no se maneja como una referencia RValue, sino como una "Referencia universal / de reenvío"; se aplican las " Reglas de colapso de referencia".
Esto también vale para
const auto &&x = ...expr...
como se muestra en el ejemplo de §7.1.6.4. (7), al menos para const auto &x
.
Pero, como dice PiotrS en los comentarios de las preguntas, cualquiera de los calificadores anula la urgencia:
no, porque ni
T
en latemplate<class T> void f(const T&&)
es una referencia de reenvío, niconst auto&&
es. El hecho de queT&&
en la declaración de parámetros no implica que esté remitiendo la referencia. SoloT&&
puro sin calificadores comoconst
ovolatile
es referencia de reenvío, lo que significa que tiene que sertemplate<class T> void f(T&&)
oauto&&
, y nuncaconst T&&
o constauto&&