c++ - 关于在模板中使用可变参数的逻辑运算符

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

我不知道这段代码中发生了什么。

SimpleFunction(1,2,3) 等于

1&&(2&&3) //1

1||(2||3) //1

SimpleFunction(1) 等于

1&&Something //1

1||Something //1

SimpleFunction() 等于

voidvalue (&&) //1

voidvalue (||) //0

什么是“某事”?

SimpleFunction(void) 中发生了什么??

一元折叠中的逻辑运算符有什么特别之处吗??

#include<iostream>
using namespace std;


template <typename ...Ts>
void SimpleFunction(Ts ... ts)
{
    cout<<(ts && ...)<<endl;
    cout<<(ts || ...)<<endl;
}

int main()
{
SimpleFunction(); // 1, 0
cout<<endl;

SimpleFunction(1); // 1, 1
cout<<endl;

SimpleFunction(1,2,3); // 1, 1
cout<<endl;

return 0;
}

最佳答案

当包包含零个元素时,一元 &&|| 折叠被定义为返回 truefalse,分别。事实上,它们是仅有的三个允许用零元素折叠的运算符中的两个,最后一个是逗号运算符 ,,它返回类型为 void 的纯右值。这就是为什么像 nums + ... 这样的代码通常应该重写为 nums + ... + 0

当包包含一个元素时,折叠表达式总是扩展到唯一的元素。

为什么?标准是这么说的。因为它被定义为唯一有意义的方式。除此之外没有更多要说的了。

关于c++ - 关于在模板中使用可变参数的逻辑运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57229738/

相关文章:

c++ - 满足条件时如何在中间停止折叠表达式函数调用并返回该值?

c++ - 这是定义了吗?

c++ - 使用空参数包函数参数调用初始化列表中的函数

c++ - 迭代 std::tuple 的简单方法是什么?

c++ - 三个 std::complex 特化和 noexcept

c++ - 可变函数和折叠表达式 : Fatal Error while trying to compile in Visual Studio 2017

c++ - 清除屏幕上的特定位置

c++ - 所有 STL 容器的通用哈希函数

c++ - 迭代器库的正面和背面提案

c++ - 我可以在此示例中使用折叠表达式吗