make_signed <unsigned long> :: type是int?

DaB*_*ain 6 c++ types visual-studio-2010 c++11

我正在使用Visual Studio 2010,以下代码让我有点困惑:

#include<type_traits>
auto x = std::make_signed<unsigned long>::type();
Run Code Online (Sandbox Code Playgroud)

x将是int类型,但我预计会很长.我知道VS10中的int和long都是4字节整数.但即使有符号长整数适合int,int对我来说也不是对应于unsigned long的有符号整数类型.所以我的问题是:这是一个错误/技术不准确或标准的规范是否允许这个结果?

Cas*_*sey 8

C++ 11 20.9.7.3 [meta.trans.sign]描述make_signed:

如果T名称为(可能是cv限定的)有符号整数类型(3.9.1),则成员typedef type应为该类型命名T; 否则,如果T名称(可能是cv限定的)无符号整数类型则type应该命名相应的有符号整数类型,并使用与T [ emphasis added ] 相同的cv限定符 ; 否则,type应将具有最小等级(4.13)的有符号整数类型命名为sizeof(T) == sizeof(type),具有相同的cv限定符T.

要求: T应该是(可能是cv限定的)整数类型或枚举,但不是bool类型.

我会考虑的"相应的符号整型" unsigned longlong.我认为没有太多的解释空间.

编辑:由于标准定义了"相应的有符号整数类型",因此无法进行解释.3.9.1/2状态:

有五种标准的有符号整数类型:" signed char"," short int"," int"," long int"和" long long int"....

和3.9.1/3:

对于每个标准有符号整数类型,存在相应的(但不同的)标准无符号整数类型:" unsigned char"," unsigned short int"," unsigned int"," unsigned long int"和" unsigned long long int",每个类型占用相同的存储量并具有与对应的有符号整数类型相同的对齐要求(3.11); 也就是说,每个有符号整数类型具有与其对应的无符号整数类型相同的对象表示....

相应的有符号整数类型unsigned long int很明显long int.