自动提升算术运算

问题描述

请参见以下代码:

#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更改为boolcharsigned charunsigned charunsigned 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;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...