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