C++ 带decltype布尔运算的尾随返回类型

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;

我决定使用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;
在这种情况下,它工作得很好,但后来我决定尝试以下方法:

->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
的实例化应该失败,因为
返回
试图将临时值绑定到非常量左值引用。见和。