Berikut ini tidak mengkompilasi:
#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;
}
Kesalahan kompiler adalah: error: assignment of read-only reference 's'
Sekarang dalam kasus saya yang sebenarnya daftar dibuat dari variabel anggota di kelas.
Sekarang, ini tidak berfungsi karena ekspresi menjadi initializer_list<int>
yang benar-benar menyalin a, b, c, dan d - karenanya juga tidak memungkinkan modifikasi.
Pertanyaan saya ada dua:
Apakah ada motivasi di balik tidak memungkinkan untuk menulis rentang berbasis untuk loop dengan cara ini? misalnya. mungkin ada kasus khusus untuk ekspresi penyangga telanjang.
Apa cara rapi dan rapi untuk memperbaiki jenis loop ini?
Sesuatu di sepanjang garis ini akan lebih disukai:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
Saya tidak menganggap pointer tipuan solusi yang baik (yaitu {&a, &b, &c, &d}
) - solusi apa pun harus memberikan referensi elemen secara langsung ketika iterator dide-referensi .
initializer_list
sebagian besar tampilan pada const
array.
{ &a, &b, &c, &d }
, Anda tidak akan menginginkan keduanya:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
.