loop instead for based c++ for-loop c++11 auto universal-reference

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