Este código falla, desde auto & es una referencia constante. [énfasis mío]
Su razonamiento no se sostiene. En un bucle for basado en rango, lo que usted declara (aquí, auto& ab
) es no vinculado a la expresión de rango (aquí, {a,b }
). En su lugar, ab
se inicializará a partir del elementos del rango, no el rango en sí.
En su lugar, el error proviene de llamar a std::sort
con los parámetros ab.begin()
/ab.end()
, que pueden ser fácilmente observados al comentar el cuerpo del bucle. Como ha señalado RMartinho, los elementos del std::initializer_list<std::vector<double>>
son inmutables, y no se puede ordenar un contenedor const
(std::sort
mezcla los elementos usando movimientos, no se puede asignar a un elemento const
).
Suponiendo que desee (de forma independiente) Clasificar los dos vectores, se puede hacer:
for(auto& ab: { std::ref(a), std::ref(b) })
std::sort(std::begin(ab.get()), std::end(ab.get()));
en cuenta que de acuerdo a las reglas de deducción de argumento plantilla, auto&
está muy bien aquí y auto
se deducirá a const std::reference_wrapper<std::vector<double>>
, produciendo std::reference_wrapper<std::vector<double>> const&
como el tipo de ab
.
¿Cuál es '{a, b}'? –
@Lightness es un 'std :: initializer_list>'. El problema aquí es que los iteradores de una lista de inicializadores son * siempre * 'const'. –
Así que ahí lo tienes. Me pregunto si alguna magia de reenvío podría ayudar aquí. –