ต่อไปนี้ไม่ได้รวบรวม:
#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}
) - การแก้ปัญหาใด ๆ ควรให้การอ้างอิงองค์ประกอบโดยตรงเมื่อ iterator คือ de-อ้างอิง
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 }
คือการสร้างรายการของตัวชี้แทน: