C++ 算术运算的自动升级

C++ 算术运算的自动升级,c++,integer-promotion,C++,Integer Promotion,请参阅以下代码: #include <type_traits> int main() { using T = short; auto x = T(1) + T(1); static_assert(std::is_same_v<decltype(x), T>); } #包括 int main() { 使用T=short; 自动x=T(1)+T(1); 静态断言(std::is_same_v); } 似乎上面的static_assert对于所有gc

请参阅以下代码:

#include <type_traits>
int main()
{
    using T = short;
    auto x = T(1) + T(1);
    static_assert(std::is_same_v<decltype(x), T>);
}
#包括
int main()
{
使用T=short;
自动x=T(1)+T(1);
静态断言(std::is_same_v);
}
似乎上面的
static_assert
对于所有gcc、clang和msvc都失败了,我不明白为什么。如果我将
short
更改为
bool
char
signed char
unsigned char
unsigned short
,断言仍然失败,因为对于所有这些情况,
decltype(x)
都被推断为
int


根据中的解释,这是正确的行为吗?

是的,需要从
short
升级到
int

发件人:

如果传递给算术运算符的操作数是整数或非作用域枚举类型,则在任何其他操作之前(但在左值到右值转换之后,如果适用),操作数将进行整数提升

来自(我的):

小整数类型(如char)的pr值可以转换为大整数类型(如int)的pr值。特别是,算术运算符不接受小于int的类型作为参数,如果适用,在左值到右值转换后会自动应用整数提升

最后:

有符号字符或有符号短字符可以转换为int


积分提升页面解释说,
short
被提升为
int
。这可能是一个更好的链接:。两个操作数至少提升为
int
(或更大的类型或浮点类型)。