【发布时间】:2019-08-27 06:34:45
【问题描述】:
我正在使用此代码将指针转换为size_t,它用于::std::hash 函数中,该函数应在编译时散列给定指针,并且由于reinterpret_casts 不允许在constexpr 中使用,我想出了以下解决方案,它按预期工作,但我想知道这是否可以被认为是一个好主意。
如果你能给我一些关于这段代码的可移植性的指示,那也很棒。
union {
size_t datr;
void* pointer;
} dummy{.pointer = (void*) somePointer};
size_t pointerAsAsize_t = dummy.datr; // how portable is this?
有没有更好的解决方案——如上所述,我想创建一个在编译时运行的::std::hash<some_pointer*>。
【问题讨论】:
-
你能在多个编译器和平台上进行测试吗?
-
鉴于
.pointer已设置但从未读取过,编译器可能根本不会费心设置它,因为它可以假定您从未从.datr读取过,除非您先写信给它。 -
“它按预期工作”我相信不在常量评估中(例如模板参数、constexpr 变量初始化器)。
-
指针值在编译时通常是未知的。目前尚不清楚您打算如何散列未知值。
-
Accessing an inactive union member 是未定义的行为。