这是一个最小的、完整的、可验证的示例我知道这不是共产主义。无论如何,给定结构:
struct Foo {
int even;
int odd;
};
istream& operator>>(istream& lhs, Foo& rhs) {
int input;
lhs >> input;
(input % 2 == 0 ? rhs.even : rhs.odd) = input;
return lhs;
}
我可以执行以下操作:
stringstream bar("1 2 3 4 5 6 7 8 9 0");
for (const auto& i : vector<Foo>{istream_iterator<Foo>(bar), istream_iterator<Foo>()}) {
cout << i.even << ' ' << i.odd << endl;
}
然而,这给了我结果:
-1215720516 1
2 1
2 3
4 3
4 5
6 5
6 7
8 7
8 9
0 9
要零初始化,Foo
我可以编写代码:
for(Foo i{}; bar >> i; i = Foo{}) {
cout << i.even << ' ' << i.odd << endl;
}
这给了我我的预期结果:
0 1
2 0
0 3
4 0
0 5
6 0
0 7
8 0
0 9
0 0
我知道拥有一个不完全覆盖变量的提取运算符是粗略的。这最初源于我在此处的回答和此处的问题,在我看来,我更自然地期望在读取之间对变量进行零初始化。在任何情况下,是否可以使用这样的变量在读取之间初始化为零,或者我必须使用-loop?istream_iterator
for