我正在使用Visual Studio 2010,以下代码让我感到困惑:
#include<type_traits>
auto x = std::make_signed<unsigned long>::type();
x将是int类型,但我预计会很长。我知道VS10中的int和long都是4字节整数。但即使有符号长整数适合int,int对我来说也不是对应于unsigned long的有符号整数类型。所以我的问题是:这是一个错误/技术不准确,还是标准的规范允许这个结果?
答案 0 :(得分:8)
C ++ 11 20.9.7.3 [meta.trans.sign]描述了make_signed
:
如果
T
命名一个(可能是cv限定的)有符号整数类型(3.9.1),那么 member typedeftype
应将类型命名为T
;否则,如果T
命名a (可能是cv-qualified)无符号整数类型,然后type
应该命名 相应的有符号整数类型,具有与T
相同的cv限定符 [强调添加]; 否则,type
应将带有最小值的有符号整数类型命名 排名(4.13)sizeof(T) == sizeof(type)
,具有相同的排名 cv-qualifiers为T
。要求:
T
应为(可能是cv限定的)整数类型或枚举,但不是bool
类型。
我会考虑&#34;相应的有符号整数类型&#34; unsigned long
为long
。我认为没有多大的解释空间。
编辑:由于标准定义了#34;对应的有符号整数类型&#34;,因此没有用于解释的空间。 3.9.1 / 2状态:
有五种标准有符号整数类型:“
signed char
”,“short int
”,“int
”,“long int
”,和“long long int
”。 ...
和3.9.1 / 3:
对于每个标准有符号整数类型,存在相应的(但不同的)标准无符号整数类型:“
unsigned char
”,“unsigned short int
”,“{ {1}}“,”unsigned int
“和”unsigned long int
“,每个占用相同的存储量,并且具有与相应的有符号整数类型相同的对齐要求(3.11);也就是说,每个有符号整数类型具有与其对应的无符号整数类型相同的对象表示。 ...
相应的有符号整数类型unsigned long long int
显然是unsigned long int
。
答案 1 :(得分:0)
可能你的测试可能有缺陷?我不确定你没有发布任何代码..但是,对于这样的测试,请勿使用大小来确定返回的类型。当long可以与int相同时,这样的测试是不准确的。
例如:
#include <type_traits>
#include <iostream>
#include <typeinfo>
std::make_signed<unsigned long>::type x;
int main()
{
std::cout<<(sizeof(x) == sizeof(int));
}
是实现定义的,如果long与int的大小相同,则返回true。在大多数系统上,这将返回true。
这样做的:
#include <type_traits>
#include <iostream>
#include <typeinfo>
std::make_signed<unsigned long>::type x;
int main()
{
std::cout<<typeid(x).name();
}
如果L
是x
,将打印long
,如果I
是x
,则会打印int
。