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
(或更大的类型或浮点类型)。