奇怪类型的演绎

Strange type deduction

本文关键字:演绎 类型      更新时间:2024-05-10

今天我看到了一个非常奇怪的类型推导。这是代码:

unsigned int y = 15;
int k = 5;
auto t = k - y / 2;

由于kint,所以我认为t的类型也应该是int。但令我惊讶的是,它的类型是unsigned int。我不明白为什么类型被推导为unsigned int。知道为什么吗?

由于通常的算术转换,如果两个操作数具有相同的转换秩,而其中一个操作数的类型为无符号整数,则表达式的类型具有相同的无符号整数类型。

来自C++17标准(5个表达式,第10页(

否则,如果具有无符号整数类型的操作数具有秩大于或等于另一操作数的类型的秩,带符号整数类型的操作数应转换为无符号整数类型的操作数。

注意类型unsigned int的转换秩等于类型int的秩(signed int(。来自C++17标准(4.13整数转换等级,第1页(

—任何无符号整数类型的秩都应等于对应的有符号整数类型

下面是一个更有趣的例子。让我们假设有两个声明

unsigned int x = 0;
long y = 0;

并且这两种类型的宽度相同并且例如等于CCD_ 10字节。众所周知,类型long的秩大于类型unsigned int的秩。出现了一个问题,表达式的类型是什么

x + y

表达式的类型为unsigned long.:(

这里是一个演示程序,但使用了类型long longunsigned long来代替类型longunsigned int

#include <iostream>
#include <iomanip>
#include <type_traits>
int main() 
{
unsigned long int x = 0;
long long int y = 0;
std::cout << "sizeof( unsigned long ) = " 
<< sizeof( unsigned long )
<< 'n';
std::cout << "sizeof( long long ) = " 
<< sizeof( long long )
<< 'n';
std::cout << std::boolalpha 
<< std::is_same<unsigned long long, decltype( x + y )>::value
<< 'n';
return 0;
}

程序输出为

sizeof( unsigned long ) = 8
sizeof( long long ) = 8
true

这就是表达式CCD_ 18的类型是CCD_。