当您考虑它时,实际上非常简单,要在重载之前获取对象/函数的真实地址,operator&
您需要将对象视为不同于它的真实存在的东西,某种不能具有重载运算符的类型。 . 一种内在类型(例如char
)。
Achar
没有对齐,可以驻留在任何其他对象可以驻留的任何地方,话虽如此;将对象转换为对 char 的引用是一个很好的开始。
但是在做的时候涉及到的黑魔法reinterpret_cast<const volatile char&>
呢?
为了重新解释从实现中返回的指针,addressof
我们最终将要丢弃限定符,例如const
and volatile
(最终得到一个普通的引用char
)。这两个可以很容易地添加reinterpret_cast
,但要求它删除它们是非法的。
T1 const a; reinterpret_cast<T2&> (a);
/* error: reinterpret_cast from type ‘...’ to type ‘...’ casts away qualifiers */
这有点像“比抱歉更安全”的把戏。“让我们添加它们,以防万一,我们稍后会删除它们。”
后来我们抛弃了限定符(const和volatile),const_cast<char&>
最终得到一个对 的简单引用char
,作为最后一步,这个结果变成了一个指向我们传递给实现的任何类型的指针。
这个阶段的一个相关问题是为什么我们没有跳过使用reinterpret_cast
而直接进入const_cast
? 这也有一个简单的答案:const_cast
可以添加/删除限定符,但不能更改基础类型。
T1 a; const_cast<T2&> (a);
/* error: invalid const_cast from type ‘T1*’ to type ‘T2*’ */
它可能不像馅饼那么容易,但是当你得到它时它的味道肯定很好......