折叠表达式:右移初始化行为
fold expression: right shift initialization behavior
我对折叠表达式很感兴趣,以便更好地理解我可以在我的项目中的哪些地方使用它们。所以我选择用一个简单的
来初始化它们
(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
。
我认为这里的教训是"mutations and folds don't mix"。
(datas >>= ...)
等同于 d1 >>= (d2 >>= (d3 >>= d4));
证明:
#include <iostream>
template<typename...Ts>
void set(Ts&&... datas)
{
(datas = ... = 1);
}
template<typename...Ts>
void print(Ts&&... datas)
{
(std::cout << ... << (std::to_string(datas) + " ")) << std::endl;
}
template<typename... T>
void test(T&&... datas) {
set(datas...);
(datas >>= ...);
print(datas...);
}
void test2(int& d1, int& d2, int& d3, int& d4)
{
set(d1,d2,d3,d4);
d1 >>= (d2 >>= (d3 >>= d4));
print(d1,d2,d3,d4);
}
int main(int argc, char const *argv[])
{
int v1, v2, v3, v4;
test(v1, v2, v3, v4);
test2(v1, v2, v3, v4);
return 0;
}
预期结果:
0 1 0 1
0 1 0 1
我对折叠表达式很感兴趣,以便更好地理解我可以在我的项目中的哪些地方使用它们。所以我选择用一个简单的
来初始化它们(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
。
我认为这里的教训是"mutations and folds don't mix"。
(datas >>= ...)
等同于 d1 >>= (d2 >>= (d3 >>= d4));
证明:
#include <iostream>
template<typename...Ts>
void set(Ts&&... datas)
{
(datas = ... = 1);
}
template<typename...Ts>
void print(Ts&&... datas)
{
(std::cout << ... << (std::to_string(datas) + " ")) << std::endl;
}
template<typename... T>
void test(T&&... datas) {
set(datas...);
(datas >>= ...);
print(datas...);
}
void test2(int& d1, int& d2, int& d3, int& d4)
{
set(d1,d2,d3,d4);
d1 >>= (d2 >>= (d3 >>= d4));
print(d1,d2,d3,d4);
}
int main(int argc, char const *argv[])
{
int v1, v2, v3, v4;
test(v1, v2, v3, v4);
test2(v1, v2, v3, v4);
return 0;
}
预期结果:
0 1 0 1
0 1 0 1