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

About Logical operator using variable parameter in templates

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

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

什么是'Something?'

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;
}

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

当包中包含一个元素时,折叠表达式始终会展开为唯一的元素。

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