Далі не компілюється:
#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'
Тепер у моєму фактичному випадку список складається із змінних членів класу.
Тепер це не працює, оскільки вираз стає тим, initializer_list<int>
що насправді копіює a, b, c і d - отже, також не дозволяє модифікувати.
Моє запитання двояке:
Чи є якась мотивація, що не дозволяє таким чином написати діапазон на основі циклу? напр. можливо, може бути особливий випадок для голих дужних виразів.
Який синтаксичний акуратний спосіб фіксації цього типу петлі?
Щось у цьому напрямку було б кращим:
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 }
.