使用decltype布尔运算的尾随返回类型

时间:2014-01-15 11:04:16

标签: c++ c++11

我决定玩一个尾随返回类型的游戏,下面显示了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将选择的类型的层次结构?

2 个答案:

答案 0 :(得分:5)

简短回答:因为表达式的类型是int而不是bool

答案很长:通过调用Add(true, true),您的模板类型参数TU被推断为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升级为1false的prvalue升级为0

这可以通过以下结果轻松看出:

std::cout << (true + true);

is 2

在第一种情况下,decltype(t, u)显然是bool,因为tu都是bool。 在第二种情况下,由于上述原因,decltype(t + u)int