c++ - `uintptr_t` 类型是否有定义的总排序?
问题描述
C++ 中的指针没有定义的总排序,除非它们属于一组狭窄的标准,例如是同一子对象或数组 ( expr.rel/4
, defns.order.ptr
) 的所有部分。
事实上,即使要提供基本的排序保证,您也不能使用operator<
,而是必须使用std::less
来自不同子对象的指针——否则结果不是明确定义的行为。来自comparisons.general/2
:
对于模板
less
、greater
、less_equal
和greater_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);
}
解决方案
推荐阅读
- android - 如何在android中更改数字选择器的背景颜色
- c# - 使用 mvvmlight 在 Xamarin.Forms 中实现 acr.UserDialogs
- react-native - ReNative,Android 错误 - SDK 目录的路径就像链接了两次,无法构建,不知道为什么
- javascript - 如何根据另一个引导日期时间选择器更改一个引导日期时间选择器值
- spring-boot - 自定义访问日志文件名的后缀
- arrays - 将数组放入新工作表?
- jvm - 关于预写屏障的 g1 gc 问题
- docker - Kubernetes本地最佳方式4
- image - 大会 x86:如何显示转换为零和一的图像?
- linux - AWS EFS:如何浏览文件?