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
?
左折叠与右折叠是 ((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
。
相关文章:
- 一元*运算符的操作数是否期望一个 prvalue
- 一元"运算符"未在C++中定义
- C2675 一元运算符由错误的作用域引起
- 你能帮我了解重载一元运算符和二进制运算符之间的区别吗?
- 泛型lambda和一元+运算符
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 为什么我不能定义一元运算符,然后在 MSVC 的模板类中声明具有相同名称的友元二进制运算符?
- 为什么一元运算符和不需要完整类型?
- 在函数调用之前,一元运算符会否定运算符
- 一元运算符关联是否有意义
- 如何重载一元/运算符
- 使一元运算符为二进制运算符
- 如何从函数模板类成员内的转换算法参数指向一元运算符函数
- 运算符重载:一元运算符重载函数返回在此代码中如何工作
- C++中一元运算符重载困难
- MTL4 将一元运算符(例如 abs())元素应用于dense_vector<double>
- C++中的一元运算符重载类型(新手)
- 在C++中,将任意在位运算符转换为一元运算符
- 为后缀重载一元运算符
- 一元 + 运算符在 int& 上