5

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

实时代码

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

?

4

3 回答 3

11

左折叠和右折叠是和之间的区别((a,b),c)(a,(b,c))但是当使用内置,运算符时它们具有完全相同的效果:它们首先评估a,然后是b最后c。要查看差异,您需要使用带有自定义重载,运算符的类型。

语法可能看起来好像会反转参数,但不,这不会发生。

于 2018-04-16T14:23:51.300 回答
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))

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

于 2018-04-16T14:23:41.860 回答
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

于 2018-04-16T14:24:36.627 回答