Nie można skompilować:
#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;
}
Błąd kompilatora to: error: assignment of read-only reference 's'
Teraz w moim przypadku lista składa się ze zmiennych składowych w klasie.
Teraz to nie działa, ponieważ wyrażenie staje się initializer_list<int>
tym, które faktycznie kopiuje a, b, c i d - stąd też nie zezwala na modyfikację.
Moje pytanie jest dwojakie:
Czy kryje się za tym jakaś motywacja, by nie pisać w ten sposób pętli bazującej na zakresie? na przykład. być może mógłby istnieć specjalny przypadek nagich wyrazów nawiasów klamrowych.
Jaki jest porządny składni sposób naprawy tego typu pętli?
Preferowane byłoby coś wzdłuż tej linii:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
Nie uważam pośrednictwa wskaźnika za dobre rozwiązanie (to znaczy {&a, &b, &c, &d}
) - każde rozwiązanie powinno dawać odwołanie do elementu bezpośrednio, gdy iterator jest usunięty z odniesienia .
initializer_list
jest głównie widokiem const
tablicy.
{ &a, &b, &c, &d }
, nie będziesz chciał:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
.