C++ 签名<;未签名的长字符串>;::类型是int?

C++ 签名<;未签名的长字符串>;::类型是int?,c++,visual-studio-2010,c++11,types,C++,Visual Studio 2010,C++11,Types,我正在使用Visual Studio 2010,以下代码让我有点困惑: #include<type_traits> auto x = std::make_signed<unsigned long>::type(); #包括 auto x=std::make_signed::type(); x将是int类型,但我会期待很长时间。我知道VS10中的int和long都是4字节整数。但是,即使有符号long适合int,int对我来说也不是对应于无符号long的有符号整数类型。

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

#include<type_traits>
auto x = std::make_signed<unsigned long>::type();
#包括
auto x=std::make_signed::type();

x将是int类型,但我会期待很长时间。我知道VS10中的int和long都是4字节整数。但是,即使有符号long适合int,int对我来说也不是对应于无符号long的有符号整数类型。因此,我的问题是:这是一个错误/技术错误,还是标准的规范允许这种结果?

C++11 20.9.7.3[meta.trans.sign]描述了
make\u signed

如果
T
命名了一个(可能是cv限定的)有符号整数类型(3.9.1),则 成员类型DEF
type
应命名类型
T
;否则,如果
T
命名一个 (可能是cv限定的)无符号整数类型然后
类型
应命名 对应的有符号整数类型,具有与
T
[强调添加]相同的cv限定符; 否则,
type
应使用最小值命名有符号整数类型 等级(4.13),其
sizeof(T)==sizeof(type)
,具有相同的 cv限定符为
T

要求:
T
应为(可能符合cv条件的)积分类型或枚举类型,但不是
bool
类型

我会考虑<代码>对应的符号整数类型>未签名的长< /代码>为<代码> long < /COD>。我认为没有太多的解释余地

编辑:因为标准定义了“对应的有符号整数类型”,所以没有解释的余地。3.9.1/2规定:

有五种标准的带符号整数类型:“
signed char
”、“
short int
”、“
int
”、“
long int
”和“
long long int

和3.9.1/3:

对于每种标准有符号整数类型,都存在相应的(但不同的)标准无符号整数类型:“
无符号字符”、“
无符号短整型”、“
无符号长整型”、“
无符号长整型”
”和“
无符号长整型”,每种类型占用相同的存储量,并且与相应的有符号整数类型具有相同的对齐要求(3.11);也就是说,每个有符号整数类型与其对应的无符号整数类型具有相同的对象表示形式


无符号长int
的相应有符号整数类型显然是
长int

您的测试可能有缺陷?我不确定,因为你没有发布代码。。但是,对于这样的测试,不要使用大小来确定返回的类型。当long可以与int大小相同时,这样的测试是不准确的

例如:

#include <type_traits>
#include <iostream>
#include <typeinfo>

std::make_signed<unsigned long>::type x;

int main()
{
    std::cout<<(sizeof(x) == sizeof(int));
}
#包括
#包括
#包括
std::make_signed::type x;
int main()
{

std::coutI在GCC 4.9.0上获得
long
,FWIW。在我的VS2013 Express上,我也获得
long
。VS2012也是
long
。我同意,GCC也是如此。这似乎是VS2010的一个未解决问题。正如我在上面的评论中提到的,它至少在VS2013中得到了修复。如果有人愿意检查VS2012,请留下评论,因为这仍然是int请告诉我。我没有使用大小来确定类型。正如我在VS2010中的问题中提到的,int和long都是4字节的整数。Visual Studio IDE告诉我这是一个int,因为它是一个只包含头的实现,所以我还可以检查代码。对示例进行了一些更改,使其更加明显。
#include <type_traits>
#include <iostream>
#include <typeinfo>

std::make_signed<unsigned long>::type x;

int main()
{
    std::cout<<typeid(x).name();
}