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&& .