C ++一元右折叠与带逗号运算符的一元左折叠
C++ unary right fold vs unary left fold with comma operator
为什么逗号分隔的一元左折叠产生与右折叠相同的结果?
template<class ...Args>
void right_fold(Args... args){
((std::cout << args),...);
}
template<class ...Args>
void left_fold(Args... args){
(...,(std::cout << args));
}
int main()
{
right_fold(1,2,3,4);
std::cout << std::endl;
left_fold(1,2,3,4);
}
输出:
1234
1234
不应该是:
4321
1234
?
这些折叠分别展开为:
((std::cout << 1), ((std::cout << 2), ((std::cout << 3), (std::cout << 4))))
...和:
((((std::cout << 1), (std::cout << 2)), (std::cout << 3)), (std::cout << 4))
尽管有一堆括号,但它们在执行顺序上是等价的:从左到右。
左折叠与右折叠是((a,b),c)
和(a,(b,c))
之间的区别,但是当使用内置的,
运算符时它们具有完全相同的效果:它们首先评估a
,然后是 b
,最后是 c
。要查看差异,您需要使用具有自定义重载 ,
运算符的类型。
语法可能看起来好像会反转参数,但不,那不会发生。
因为它们确实是同一个东西:
((std::cout << 1, std::cout << 2), std::cout << 3), std::cout << 4;
std::cout << 1, (std::cout << 2, (std::cout << 3, std::cout << 4));
两者都有输出1234
.
为什么逗号分隔的一元左折叠产生与右折叠相同的结果?
template<class ...Args>
void right_fold(Args... args){
((std::cout << args),...);
}
template<class ...Args>
void left_fold(Args... args){
(...,(std::cout << args));
}
int main()
{
right_fold(1,2,3,4);
std::cout << std::endl;
left_fold(1,2,3,4);
}
输出:
1234
1234
不应该是:
4321
1234
?
这些折叠分别展开为:
((std::cout << 1), ((std::cout << 2), ((std::cout << 3), (std::cout << 4))))
...和:
((((std::cout << 1), (std::cout << 2)), (std::cout << 3)), (std::cout << 4))
尽管有一堆括号,但它们在执行顺序上是等价的:从左到右。
左折叠与右折叠是((a,b),c)
和(a,(b,c))
之间的区别,但是当使用内置的,
运算符时它们具有完全相同的效果:它们首先评估a
,然后是 b
,最后是 c
。要查看差异,您需要使用具有自定义重载 ,
运算符的类型。
语法可能看起来好像会反转参数,但不,那不会发生。
因为它们确实是同一个东西:
((std::cout << 1, std::cout << 2), std::cout << 3), std::cout << 4;
std::cout << 1, (std::cout << 2, (std::cout << 3, std::cout << 4));
两者都有输出1234
.