instead - for auto p m c++
¿Por qué un enunciado basado en rango toma el rango en auto &&? (1)
¿No sería automático y suficiente?
No, no lo haría. No permitiría el uso de una expresión de valor r que calcule un rango. auto&&
se usa porque puede vincularse a una expresión de valor l o a una expresión de valor r. Por lo tanto, no necesita insertar el rango en una variable para que funcione.
O, para decirlo de otra manera, esto no sería posible:
for(const auto &v : std::vector<int>{1, 43, 5, 2, 4})
{
}
¿No
const auto&
suficiente?
No, no lo haría. Un const std::vector
solo devolverá const_iterator
s a su contenido. Si quieres hacer un recorrido no constuido sobre los contenidos, eso no ayudará.
Un enunciado basado for
rango se define en § 6.5.4 para ser equivalente a:
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
donde range-init
se define para las dos formas de rango for
:
for ( for-range-declaration : expression ) => ( expression )
for ( for-range-declaration : braced-init-list ) => braced-init-list
(la cláusula especifica más el significado de las otras subexpresiones)
¿Por qué se __range
al tipo deducido auto&&
? Mi comprensión de auto&&
es que es útil para preservar el valor original (lvalue / rvalue) de una expresión pasándola a std::forward
. Sin embargo, __range
no se pasa a ninguna parte a través de std::forward
. Solo se usa al obtener los iteradores de rango, como uno de __range
, __range.begin()
o begin(__range)
.
¿Cuál es el beneficio de utilizar el " auto&&
referencia universal" auto&&
? ¿No sería auto&
suficiente?
Nota: Por lo que puedo decir, la propuesta no dice nada sobre la elección de auto&&
.