以下内容无法编译:
#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的a,因此也不允许修改。
我的问题有两个:
不允许以这种方式编写基于范围的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 }
。