Следующее не компилируется:
#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;
}
Ошибка компилятора: error: assignment of read-only reference 's'
Теперь в моем реальном случае список состоит из переменных-членов класса.
Теперь это не работает, потому что выражение становится a, initializer_list<int>
которое на самом деле копирует a, b, c и d - следовательно, также не допускает изменения.
У меня вопрос двоякий:
Есть ли какая-то мотивация за то, что мы не позволяем писать цикл for на основе диапазона таким образом? например. возможно, может быть особый случай для выражений «голые скобки».
Что такое синтаксический аккуратный способ исправления этого типа петли?
Что-то в этом направлении было бы предпочтительным:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
Я не считаю косвенное {&a, &b, &c, &d}
указание хорошим решением (то есть ) - любое решение должно давать ссылку на элемент непосредственно, когда итератор разыменовывается .
initializer_list
в основном вид на const
массив.
{ &a, &b, &c, &d }
, вы не захотите ни:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
.