Sau đây không biên dịch:
#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;
}
Lỗi trình biên dịch là: error: assignment of read-only reference 's'
Bây giờ trong trường hợp thực tế của tôi, danh sách được tạo từ các biến thành viên trên một lớp.
Bây giờ, điều này không hoạt động vì biểu thức trở thành một initializer_list<int>
bản sao thực sự sao chép a, b, c và d - do đó cũng không cho phép sửa đổi.
Câu hỏi của tôi là hai lần:
Có động lực nào đằng sau việc không cho phép viết một vòng lặp dựa trên phạm vi theo cách này không? ví dụ. có lẽ có thể có một trường hợp đặc biệt cho biểu hiện niềng răng trần.
Một cách gọn gàng cú pháp để sửa chữa loại vòng lặp này là gì?
Một cái gì đó dọc theo dòng này sẽ được ưa thích:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
Tôi không coi việc xác định con trỏ là một giải pháp tốt (nghĩa là {&a, &b, &c, &d}
) - bất kỳ giải pháp nào cũng nên cung cấp tham chiếu phần tử trực tiếp khi trình lặp được hủy tham chiếu .
initializer_list
chủ yếu là một cái nhìn trên const
mảng.
{ &a, &b, &c, &d }
, bạn sẽ không muốn:for (auto& s : std::initializer_list<std::reference_wrapper<int>>{a, b, c, d}) { s.get() = 1; }
{ &a, &b, &c, &d }
.