强制性标准报价,强调我的:
5.2.19 重新解释演员表
1/ [...] 下面列出了可以使用 reinterpret_cast 显式执行的转换。无法使用 reinterpret_cast 显式执行其他转换。
4/ 指针可以显式转换为任何大到足以容纳它的整数类型。[...]
5/ 整数类型或枚举类型的值可以显式转换为指针。[...]
6/ 函数指针可以显式转换为不同类型的函数指针。[...]
7/ 对象指针可以显式转换为不同类型的对象指针。[...]
8/ 有条件地支持将函数指针转换为对象指针类型,反之亦然。[...]
9/ 空指针值 (4.10) 转换为目标类型的空指针值。[...]
10/ [...] “指向 T1 类型 X 成员的指针”可以显式转换为 [...] “指向 T2 类型 Y 成员的指针” [...]
11/ 如果可以使用 reinterpret_cast 将“指向 T1 的指针”类型的表达式显式转换为“指向 T2 的指针”类型,则可以将 [...] T1 强制转换为类型“对 T2 的引用”。[...]
除了 4/、5/ 和 11/ 中提到的整数到指针和值到引用的转换之外,唯一可以使用的转换reinterpret_cast
是指针到指针的转换。
然而在:
thing_pointer = reinterpret_cast<Thing*>(it);
it
不是指针,而是对象。碰巧这个对象被设计成以多种方式模拟指针,但它仍然不是指针。