【问题标题】:Is intptr_t a signed counterpart of uintptr_t (and vice versa)?intptr_t 是 uintptr_t 的签名对应物吗(反之亦然)?
【发布时间】:2012-05-11 00:22:38
【问题描述】:

我正在为 add_signed 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;
};

在对不同类型进行测试时,我注意到以下评估结果为真:

std::is_same<add_signed<uintptr_t>::type, intptr_t>::value  // true

与 add_unsigned MPL 类类似,以下代码的计算结果为 true:

std::is_same<add_unsigned<intptr_t>::type, uintptr_t>::value  // true

我的编译器是 MSVC 2010。

所以问题是 - 我们是否可以假设在所有(正常的)编译器中签署 intptr_t 会产生 uintptr_t 反之亦然?

【问题讨论】:

    标签: c++ c++11 metaprogramming


    【解决方案1】:

    intptr_tuintptr_t 类型在 ISO/IEC 9899:1999 (C99) 中是可选的,但其中一个实现了,另一个也实现了。所有有符号类型都有一个大小相同的无符号对应物,反之亦然。

    §7.18.1 整数类型

    当 typedef 名称仅在初始 u 不存在或存在时有所不同时,它们应表示相应的有符号和无符号类型,如 6.2.5 中所述;提供这些对应类型之一的实现也应提供另一个。

    ...

    §7.18.1.4 能够保存对象指针的整数类型

    以下类型指定一个有符号整数类型,其属性是任何有效的 指向 void 的指针可以转换为这种类型,然后再转换回指向 void 的指针, 结果将等于原始指针:

    intptr_t
    

    以下类型指定一个无符号整数类型,其属性是任何有效的 指向 void 的指针可以转换为这种类型,然后再转换回指向 void 的指针, 结果将等于原始指针:

     uintptr_t
    

    这些类型是可选的。

    请注意,在 C 标准的含义内,函数不是对象; C 标准不保证uintptr_t 可以保存函数指针。

    幸运的是,POSIX 进行了救援:它确实要求对象指针和函数指针的大小相同。

    2.12.3 指针类型

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

    注意:

    ISO C 标准不要求这样做,但符合 POSIX 要求。

    【讨论】:

      猜你喜欢
      • 2016-03-21
      • 1970-01-01
      • 2017-04-17
      • 2014-06-02
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2013-08-01
      • 2021-05-08
      相关资源
      最近更新 更多