我决定玩一个尾随返回类型的游戏,下面显示了delctype:
template<typename T, typename U>
auto Add(T t, U u) ->decltype(t,u)
{
return t + u;
}
如果我发送整数或双打,那么这种方式非常好。
Add(10,11); //21
Add(5.35,2.22); //7.57
但后来我问自己,这对布尔算法有效吗?
Add(true,true); // = 1 + 1 = 1;
Add(true, false); // = 1 + 0 = 1
Add(false, false); // = 0 + 0 = 0;
在这种情况下,它工作正常但后来我决定尝试以下方法:
->decltype(t + u)
这给了我结果:
Add(true,true); // = 1 + 1 = 2;
Add(true, false); // = 1 + 0 = 1
Add(false, false); // = 0 + 0 = 0;
我假设decltype(t + u)将返回类型推断为int而不是bool?为什么是这样?并且是否存在decltype将选择的类型的层次结构?
答案 0 :(得分:5)
简短回答:因为表达式的类型是int
而不是bool
答案很长:通过调用Add(true, true)
,您的模板类型参数T
和U
被推断为bool。因此,表达式t, u
的类型为bool
。请注意,此表达式中的逗号是逗号运算符,如@ccom所指出的那样。
由于你不能在算术上添加bool(符号+
有时在逻辑中用来表示c ++中的|
或者运算符),c ++会自动将两个bool提升为整数然后执行此外。
在decltype(t, u)
的情况下,你的返回类型是bool,因此会发生另一个隐式转换,强制你的2的整数成为一个布尔值(true,或者当转换回int时为1)
在decltype(t + u)
的情况下,返回类型是表达式的类型(int
),因此最终的转换根本就没有完成 - 给你2。
答案 1 :(得分:2)
这里的关键点是表达式bool + bool
属于int
类型,因为operator+
对bool
没有意义。
考虑到operator+
存在int
,并且标准在§4.5/ 6中指定:
bool类型的prvalue可以转换为int类型的prvalue,false变为零,true变为1。
true
的prvalue升级为1
,false
的prvalue升级为0
。
这可以通过以下结果轻松看出:
std::cout << (true + true);
is 2
。
在第一种情况下,decltype(t, u)
显然是bool
,因为t
和u
都是bool
。
在第二种情况下,由于上述原因,decltype(t + u)
是int
。