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

时间:2018-04-16 14:16:27

标签: c++ c++17 fold-expression

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

Live code

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

3 个答案:

答案 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