Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ intptr是uintptr的签字副本吗(反之亦然)?_C++_C++11_Metaprogramming - Fatal编程技术网

C++ intptr是uintptr的签字副本吗(反之亦然)?

C++ intptr是uintptr的签字副本吗(反之亦然)?,c++,c++11,metaprogramming,C++,C++11,Metaprogramming,我正在为添加签名的MPL类开发一些测试,该类将类型转换为其签名的对应类型。其定义如下: template<class T> struct add_signed { typedef T type; }; template<> struct add_signed<std::uint8_t> { typedef std::int8_t type; }; template<> struct add_signed<std::ui

我正在为添加签名的MPL类开发一些测试,该类将类型转换为其签名的对应类型。其定义如下:

template<class T>
struct add_signed { 
    typedef T type;
};

template<>
struct add_signed<std::uint8_t> { 
    typedef std::int8_t type;
};

template<>
struct add_signed<std::uint16_t> { 
    typedef std::int16_t type;
};

template<>
struct add_signed<std::uint32_t> { 
    typedef std::int32_t type;
};

template<>
struct add_signed<std::uint64_t> { 
    typedef std::int64_t type;
};
模板
结构添加_签名{
T型;
};
模板
结构添加_签名{
typedef std::int8_t类型;
};
模板
结构添加_签名{
typedef std::int16_t类型;
};
模板
结构添加_签名{
typedef std::int32_t类型;
};
模板
结构添加_签名{
typedef std::int64_t类型;
};
在对不同类型进行测试时,我注意到以下评估结果为真:

std::is_same<add_signed<uintptr_t>::type, intptr_t>::value  // true
std::is_same::value//true
类似地,对于add_unsigned MPL类,以下代码的计算结果为true:

std::is_same<add_unsigned<intptr_t>::type, uintptr_t>::value  // true
std::is_same::value//true
我的编译器是MSVC2010


因此,问题是——我们是否可以假设在所有(正常的)编译器中,签署intptr\t将产生uintpr\t,反之亦然?

类型
intptr\t
uintpr\t
在ISO/IEC 9899:1999(C99)中是可选的,但在实现其中一种的情况下,另一种也是可选的。所有有符号类型都有一个大小相同的无符号对应项,反之亦然

§7.18.1整数类型 当定义的typedef名称仅在首字母
u
的存在或不存在时不同,它们应表示6.2.5中所述的相应有符号和无符号类型;提供其中一种相应类型的实现也应提供另一种

§7.18.1.4能够容纳对象指针的整数类型 以下类型使用任何有效的属性指定有符号整数类型 指向void的指针可以转换为此类型,然后再转换回指向void的指针, 结果将与原始指针进行比较:

intptr_t
 uintptr_t
以下类型使用任何有效的属性指定无符号整数类型 指向void的指针可以转换为此类型,然后再转换回指向void的指针, 结果将与原始指针进行比较:

intptr_t
 uintptr_t
这些类型是可选的

注意,在C标准中,函数不是对象;C标准不保证
uintptr\u t
可以保存函数指针

幸运的是,拯救的步骤是:它确实要求对象指针和函数指针大小相同

2.12.3指针类型 所有函数指针类型应具有与指向
void
的类型指针相同的表示形式。将函数指针转换为
void*
不会改变表示形式。这种转换产生的
void*
值可以使用显式转换将其转换回原始函数指针类型,而不会丢失信息

注:

ISO C标准不要求这一点,但要求符合POSIX标准