C++ 带decltype布尔运算的尾随返回类型
我决定使用delctype的尾部返回类型,如下所示:C++ 带decltype布尔运算的尾随返回类型,c++,c++11,C++,C++11,我决定使用delctype的尾部返回类型,如下所示: template<typename T, typename U> auto Add(T t, U u) ->decltype(t,u) { return t + u; } 但后来我问自己,这对布尔运算有用吗 Add(true,true); // = 1 + 1 = 1; Add(true, false); // = 1 + 0 = 1 Add(false, false); // = 0 + 0 = 0;
template<typename T, typename U>
auto Add(T t, U u) ->decltype(t,u)
{
return t + u;
}
但后来我问自己,这对布尔运算有用吗
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将选择的类型是否有层次结构 简短回答:因为表达式的类型是
int
而不是bool
长回答:通过调用Add(true,true)
您的模板类型参数T
和U
被推断为bool。因此,表达式t,u
的类型是bool
。请注意,正如@ccom所指出的,此表达式中的逗号是逗号运算符
<>由于不能算术加布尔(符号<代码> +/COD>有时在逻辑中使用OR运算符表示C++中的代码> >代码>,C++将自动将布尔值提升为整数,然后执行加法。
在decltype(t,u)
的情况下,您的返回类型是bool,因此会发生另一个隐式转换,强制将2的整数转换为布尔值(当转换回int时为true或1)
在
decltype(t+u)
的情况下,返回类型是表达式的类型(int
),因此没有完成最终的转换-给你2。简短的回答:因为表达式的类型是int
而不是bool
长回答:通过调用Add(true,true)
您的模板类型参数T
和U
被推断为bool。因此,表达式t,u
的类型是bool
。请注意,正如@ccom所指出的,此表达式中的逗号是逗号运算符
<>由于不能算术加布尔(符号<代码> +/COD>有时在逻辑中使用OR运算符表示C++中的代码> >代码>,C++将自动将布尔值提升为整数,然后执行加法。
在decltype(t,u)
的情况下,您的返回类型是bool,因此会发生另一个隐式转换,强制将2的整数转换为布尔值(当转换回int时为true或1)
在
decltype(t+u)
的情况下,返回类型是表达式的类型(int
),因此没有完成最终转换-给你2。这里的关键点是表达式bool+bool
的类型是int
,因为没有操作符+
对bool
eans有意义
考虑到存在用于int
s的运算符+
,且标准在§4.5/6中规定:
bool类型的prvalue可以转换为int类型的prvalue,false变为零,true变为一
true
的PR值提升为1
,false
的PR值提升为0
这可以通过以下结果很容易看出:
std::cout << (true + true);
std::cout这里的关键点是表达式bool+bool
属于int
类型,因为没有操作符+
对bool
有意义
考虑到存在用于int
s的运算符+
,且标准在§4.5/6中规定:
bool类型的prvalue可以转换为int类型的prvalue,false变为零,true变为一
true
的PR值提升为1
,false
的PR值提升为0
这可以通过以下结果很容易看出:
std::cout << (true + true);
std::cout因为自动升级为整数的布尔和的decltype是整数?@Jeffrey抱歉修正:)@dionadar是的,这是我想的,只是一个小查询。实际上,decltype(t,u)
是decltype((t,u))
是decltype((u))
是bool&
,Add
的实例化应该失败,因为返回
试图将临时值绑定到非常量左值引用。请参阅和。因为自动升级为整数的布尔和的decltype是整数?@Jeffrey抱歉修复:)@dionadar是的,这是我的想法,只是一个小查询。实际上,decltype(t,u)
是decltype((t,u))
是decltype((u))
是bool&
,Add
的实例化应该失败,因为返回
试图将临时值绑定到非常量左值引用。见和。