我很喜欢折叠表达式,以更好地了解在项目中可以使用它们的地方。所以我选择用一个简单的方法初始化它们
(datas = ... = 1);
到目前为止,一切正常,每个值都为1。然后,我尝试使用左移初始化,以便:
(datas = ... = 1);
(datas <<= ...);
这也是我期望的工作,它增加了2的幂,很好。
最后我尝试了这个:
(datas = ... = 1);
(datas >>= ...);
它给了我
0, 1, 0, 1, 0, 1, ...
输出,我希望它全部为0。所以这里的代码是:#include <iostream>
template<typename... T>
void test(T&&... datas) {
(datas = ... = 1);
(datas >>= ...);
(std::cout << ... << (std::to_string(datas) + " ")) << std::endl;
}
int main(int argc, char const *argv[])
{
int v1, v2, v3, v4;
test(v1, v2, v3, v4);
return 0;
}
为什么是
0, 1, 0, 1
等而不是0, 0, 0, 0
?我会为每个参数做更多类似的事情:arg1 >>= arg2, arg2 >>= arg3, arg3 >>= arg4, etc
但是的确是,最后一个值应该是1,然后也是
0, 0, 0, 1
。 最佳答案
之所以这样,是因为你的弃牌是
arg1 >>= arg2 >>= arg3 >>= arg4;
arg3 >> arg4
是1 >> 1
,因此arg3
成为0
。然后,
arg2 >> arg3
是1 >> 0
,因此arg2
成为1
。然后,
arg1 >> arg2
是1 >> 1
,因此arg1
成为0
。因此,
0, 1, 0, 1
。我认为这里的教训是“突变和褶皱不混在一起”。
关于c++ - fold表达式:右移初始化行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47695379/