为什么逗号分隔的一元左折会产生与右一折相同的结果?
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
答案 0 :(得分:8)
左与右折叠是((a,b),c)
和(a,(b,c))
之间的差异,但在使用内置,
运算符时它们具有完全相同的效果:它们首先评估{{1然后是a
,最后是b
。要查看差异,您需要使用带有自定义重载c
运算符的类型。
语法可能看起来好像会反转参数,但不会,这种情况不会发生。
答案 1 :(得分:4)
这些折叠分别扩展为:
((std::cout << 1), ((std::cout << 2), ((std::cout << 3), (std::cout << 4))))
......和:
((((std::cout << 1), (std::cout << 2)), (std::cout << 3)), (std::cout << 4))
尽管有一连串的括号,但它们在执行顺序方面是相同的:从左到右。
答案 2 :(得分:4)
因为它们确实是一回事:
((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
。