问题描述
请参见以下代码:
#include <type_traits>
int main()
{
using T = short;
auto x = T(1) + T(1);
static_assert(std::is_same_v<decltype(x),T>);
}
似乎上述static_assert
对于所有gcc,clang和msvc都失败了,我不明白为什么。如果将short
更改为bool
,char
,signed char
,unsigned char
和unsigned short
中的任何一个,则断言仍然失败,因为对于所有这些案例decltype(x)
被推论为int
。
根据https://en.cppreference.com/w/cpp/language/operator_arithmetic中的解释,这是正确的行为吗?
解决方法
是的,必须将此促销从short
升级到int
。
来自https://en.cppreference.com/w/cpp/language/operator_arithmetic:
如果传递给算术运算符的操作数是整数或无作用域枚举类型,则在执行任何其他操作之前(如果适用,则在进行左值到右值转换之后),该操作数会进行整数提升。
从https://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion(强调我)开始:
小整数类型(例如char)的值可以转换为大整数类型(例如int)的pr值。特别是,算术运算符不会接受小于int 的类型作为参数,并且积分提升在左值到右值转换后自动应用(如果适用)。
最后:
带符号的char或带符号的short可以转换为int;