它的实现是定义的,并且在C++17中仍然有效,至少对GCC是这样。不能直接在两个指针之间执行异或运算;您必须通过reinterpret_cast<;标准::intptr_t>代码>。这种转换(和返回)的效果是实现定义。
实现定义意味着编译器必须记录所发生的事情。GCC提供的是:
从指针到整数的强制转换将丢弃[…],,否则位不变
从整数到指针的强制转换将丢弃[…],,否则位不变
当从指针转换为integer并再次转换时,生成的指针必须引用与原始指针相同的对象,否则行为是未定义的。
请参阅https://gcc.gnu.org/onlinedocs/gcc/Arrays-and-pointers-implementation.html
这对XOR列表意味着:
std::intptr_t ptr;
// STORE:
// - bit-cast both operands and XOR them
// - store result in ptr
ptr = reinterpret_cast<std::intptr_t>(prev) ^ reinterpret_cast<std::intptr_t>(next);
// LOAD:
// - XOR stored ptr and bit-cast to node*
auto next = reinterpret_cast<node*>(ptr ^ reinterpret_cast<std::intptr_t>(prev));
正如文档中所述,next
“必须引用与原始指针相同的对象”,因此我们可以假设next
现在是指向对象的指针,如果这样的指针最初存储在ptr
中。