首页 > 解决方案 > `uintptr_t` 类型是否有定义的总排序?

问题描述

C++ 中的指针没有定义的总排序,除非它们属于一组狭窄的标准,例如是同一子对象或数组 ( expr.rel/4, defns.order.ptr) 的所有部分。

事实上,即使要提供基本的排序保证,您也不能使用operator<,而是必须使用std::less来自不同子对象的指针——否则结果不是明确定义的行为。来自comparisons.general/2

对于模板lessgreaterless_­equalgreater_­equal,任何指针类型的特化都会产生与实现定义的指针上的严格总顺序一致的结果 ( defns.order.ptr)。

然而,在 C++ 中,我们也有(可选)类型std::uintptr_t——它被定义为一个unsigned足够大的整数值来存储一个指针,它的属性是它能够在往返往返中幸存下来void*std::uintptr_t没有void*任何损失——数据的。unsigned整数类型也有一个明确定义的总排序——这引出了我的问题。

std::uintptr_t在 C++ 抽象机的定义内,期望来自不同来源的 a 具有明确定义的顺序是否完全合理?

我不是在问这在实践中是否可行,而是假设这是明确定义的行为是否可行(我的假设是它不是


作为一个潜在应用的具体例子,我感兴趣的是,以下内容是否是正式定义明确的行为:

template <typename T>
auto my_typeid() -> std::uintptr_t
{
    // Each 'char' has a unique address since it's static and part of 
    // each unique template instantiation
    static const char s_data = 0;

    // Use this address for an ordering system, and for identity
    return reinterpret_cast<std::uintptr_t>(&s_data);
}

标签: c++language-lawyer

解决方案


推荐阅读