Aşağıdaki gelmez değil derlemek:
#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;
}
Derleyici hatası: error: assignment of read-only reference 's'
Şimdi benim gerçek durumumda liste bir sınıftaki üye değişkenlerden oluşur.
Şimdi, bu işe yaramıyor çünkü ifade initializer_list<int>
aslında a, b, c ve d'yi kopyalayan bir ifadeye dönüşüyor - dolayısıyla değiştirmeye izin vermiyor.
Sorum iki katlıdır:
Bu şekilde döngü için bir menzil tabanlı yazmaya izin vermemenin arkasında herhangi bir motivasyon var mı? Örneğin. belki de çıplak ayraç ifadeleri için özel bir durum olabilir.
Bu tür bir döngüyü düzeltmenin sözdizimsel olarak düzgün bir yolu nedir ?
Bu hat boyunca bir şey tercih edilir:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
Ben işaretçi dolaylama iyi bir çözüm (yani {&a, &b, &c, &d}
) düşünmüyorum - herhangi bir çözüm yineleyici de başvurulan olduğunda doğrudan öğe referans vermelidir .
initializer_list
çoğunlukla const
dizide bir görünümdür .
{ &a, &b, &c, &d }
, hiçbirini istemezsiniz:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
.