以下はコンパイルされません:
#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をコピーするになるため、これは機能しません。したがって、変更もできません。
私の質問は2つあります。
このように範囲ベースの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 }
。