关于在模板中使用可变参数的逻辑运算符
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 true
和 false
。事实上,它们是仅有的三个允许用零元素折叠的运算符中的两个,最后一个是逗号运算符 ,
,它 return 是类型 void
的纯右值。这就是为什么像 nums + ...
这样的代码通常应该重写为 nums + ... + 0
.
当包中包含一个元素时,折叠表达式始终会展开为唯一的元素。
为什么?标准是这么说的。因为它被定义为唯一有意义的方式。除此之外没什么好说的了。
我不知道这段代码发生了什么。
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 true
和 false
。事实上,它们是仅有的三个允许用零元素折叠的运算符中的两个,最后一个是逗号运算符 ,
,它 return 是类型 void
的纯右值。这就是为什么像 nums + ...
这样的代码通常应该重写为 nums + ... + 0
.
当包中包含一个元素时,折叠表达式始终会展开为唯一的元素。
为什么?标准是这么说的。因为它被定义为唯一有意义的方式。除此之外没什么好说的了。