Lo siguiente no compila:
#include <iostream>
int main()
{
int a{},b{},c{},d{};
for (auto& s : {a, b, c, d}) {
s = 1;
}
std::cout << a << std::endl;
return 0;
}
El error del compilador es: error: assignment of read-only reference 's'
Ahora, en mi caso real, la lista está hecha de variables miembro en una clase.
Ahora, esto no funciona porque la expresión se convierte en una initializer_list<int>
que realmente copia a, b, c y d, por lo tanto, tampoco permite modificaciones.
Mi pregunta es doble:
¿Hay alguna motivación detrás de no permitir escribir un bucle for basado en rango de esta manera? p.ej. tal vez podría haber un caso especial para las expresiones con llaves desnudas.
¿Cuál es una forma ordenada sintáctica de arreglar este tipo de bucle?
Algo en esta línea sería preferible:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
No considero que la indirección del puntero sea una buena solución (es decir {&a, &b, &c, &d}
): cualquier solución debe dar referencia al elemento directamente cuando se des-referencia el iterador .
initializer_list
es principalmente una vista en const
matriz.
{ &a, &b, &c, &d }
, tampoco querrás:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
.