c++ - 基于 for 循环的无辜范围不起作用
问题描述
以下不编译:
#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 的 an - 因此也不允许修改。
我的问题有两个:
不允许以这种方式编写基于范围的 for 循环背后有什么动机吗? 例如。也许裸括号表达式可能存在特殊情况。
修复这种循环的语法简洁方法是什么?
沿着这条线的东西将是首选:
for (auto& s : something(a, b, c, d)) {
s = 1;
}
我不认为指针间接是一个好的解决方案(即{&a, &b, &c, &d}
) - 任何解决方案都应该在迭代器被取消引用时直接给出元素引用。
解决方案
范围并不像人们想要的那样神奇。最后,必须有一个对象,编译器可以生成对成员函数或自由函数的调用begin()
,并且end()
.
最接近您可能会来的是:
#include <iostream>
int main()
{
int a{},b{},c{},d{};
for (auto s : {&a, &b, &c, &d} ) {
*s = 1;
}
std::cout << a << "\n";
return 0;
}
推荐阅读
- mongodb - 缝合功能 updateOne 错误“不允许更新”
- python - 如何将 numpy 数组传递给 Flask API?
- jquery - 字段编辑器数据表货币
- html - 如何扩大下拉菜单的大小
- javascript - 如何使用 html css 和 javascript 在图标和文本的任一侧添加行?
- python - 在python中检测当前shell是否是powershell
- css - 如何在引导卡的标题旁边放置一个按钮?
- linux - 如何从脚本创建简单的日志文件
- python - pytest - 修补类不起作用,而是调用类
- python - Keras fit 打印出矩阵