Ce qui suit ne se compile pas :
#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;
}
L'erreur du compilateur est: error: assignment of read-only reference 's'
Maintenant, dans mon cas réel, la liste est composée de variables membres sur une classe.
Maintenant, cela ne fonctionne pas parce que l'expression devient un initializer_list<int>
qui copie en fait a, b, c et d - donc ne permet pas non plus la modification.
Ma question est double:
Y a-t-il une motivation derrière ne pas permettre d'écrire une boucle for basée sur une plage de cette façon? par exemple. il pourrait peut-être y avoir un cas particulier pour les expressions d'accolade nue.
Quelle est une manière syntaxique soignée de réparer ce type de boucle?
Quelque chose dans ce sens serait préférable:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
Je ne considère pas l'indirection de pointeur comme une bonne solution (c'est-à-dire {&a, &b, &c, &d}
) - toute solution devrait donner la référence de l'élément directement lorsque l'itérateur est dé-référencé .
initializer_list
est principalement une vue sur le const
tableau.
{ &a, &b, &c, &d }
, vous ne voudrez pas non plus:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
.