#include <initializer_list>
struct Obj {
int i;
};
Obj a, b;
int main() {
for(Obj& obj : {a, b}) {
obj.i = 123;
}
}
此代码未编译,因为初始值设定项列表中的值
{a,b}
被视为常量Obj
有没有一种简单的方法可以让类似的构造工作,即迭代不同变量中的值,比如这里的
a
和b
。
如果复制a
和b
是所需的行为,则可以使用临时数组而不是初始化列表:
#include <initializer_list>
struct Obj {
int i;
} a, b;
int main() {
typedef Obj obj_arr[];
for(auto &obj : obj_arr{a, b}) {
obj.i = 123;
}
}
即使Obj
只有一个移动构造函数,这也是有效的。
这不起作用的原因是std::initializer_list
的底层元素是从a
和b
复制的,并且类型为const Obj
,因此您实际上是在尝试将常量值绑定到可变引用。
可以尝试使用以下方法解决此问题:
for (auto obj : {a, b}) {
obj.i = 123;
}
但是很快就会注意到对象a
和b
中i
的实际值没有改变。原因是在这里使用auto
时,循环变量obj
的类型将变为obj
,因此您只需循环a
和b
的副本。
实际的解决方法是可以使用std::ref
(在
#include <functional>
#include <initializer_list>
#include <iostream>
struct Obj {
int i;
};
Obj a, b;
int main()
{
for (Obj& obj : {std::ref(a), std::ref(b)}) {
obj.i = 123;
}
std::cout << a.i << '\n';
std::cout << b.i << '\n';
}
输出:
123
123
执行上述操作的另一种方法是使循环使用
const自动
for (const auto& obj : {std::ref(a), std::ref(b)}) {
obj.get().i = 123;
}
但是我认为,因为在这里使用
auto
会强制使用. get()
,这是相当麻烦的,前一种方法是解决这个问题的更好方法。
通过在循环中使用原始指针来实现这一点似乎更简单,就像@Francesco在他的回答中所做的那样,但是我有一个尽可能避免原始指针的习惯,在这种情况下,我只是相信使用引用可以使代码更清晰更干净。
它不起作用,因为在{a,b}
中,您正在制作a
和b
的副本。一种可能的解决方案是将循环变量设为指针,获取a
和b
的地址:
#include <initializer_list>
struct Obj {
int i;
};
Obj a, b;
int main() {
for(auto obj : {&a, &b}) {
obj->i = 123;
}
}
看它直播
注意:通常最好使用auto
,因为它可以避免静默隐式转换
有没有办法在for循环中使变量可迭代?我正在尝试制作一个密码生成器,对于for循环,我使用一个输入数字的变量。 当我试图在循环中使用变量时,我得到< code > ' int ' object is not iterable 。
本文向大家介绍C++ 向量迭代器,包括了C++ 向量迭代器的使用技巧和注意事项,需要的朋友参考一下 示例 begin将an返回iterator到序列容器中的第一个元素。 end返回iterator末尾的第一个元素。 如果矢量对象const,无论是begin和end返回const_iterator。如果const_iterator即使向量不返回,也要返回const,则可以使用cbegin和cend。
我有一个自定义模板类- 我想要一个常量迭代器开始于myClass,常量迭代器结束于myClass,它能够迭代myClass矩阵中的对象T,我正在努力创建这样的东西。 在我看来,我想把矩阵上的所有对象T聚集到某个局部一维向量,然后返回迭代器。从这个向量或迭代器开始。结束这个向量 此外,我希望能够支持for-each循环如下: 谢谢!
所以我做了一个简单的web应用程序,你输入一些文本,它就会显示在屏幕上,有点像聊天屏幕。 我的Python代码 我的HTML代码 日志和html都显示他们正在发送和接收数据。但是,它不打印的值,而是只打印。我很确定这是因为HTML文件。我肯定这可能是个新手犯的错误,但你知道怎么解决吗?
如何在Java 8 lambda中使用非final变量。它抛出编译错误,称“封闭范围中定义的局部变量日期必须是final或实际上是final” 我实际上想实现以下目标: 如何实现此目的?它会为 date2 引发 comilation 错误。谢谢
谢谢,伊利亚