C++一元右折与一元左折,带逗号运算符

C++ unary right fold vs unary left fold with comma operator

本文关键字:一元 运算符 C++      更新时间:2023-10-16

为什么逗号分隔的一元左折产生与右折相同的结果?

实时代码

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

左折叠与右折叠是 ((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))

尽管有一连串的括号,但它们在执行顺序方面是等效的:从左到右。

因为它们确实是一回事:

((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