C++ intptr是uintptr的签字副本吗(反之亦然)?
我正在为添加签名的MPL类开发一些测试,该类将类型转换为其签名的对应类型。其定义如下: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
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标准