【发布时间】:2018-03-04 18:30:30
【问题描述】:
cppreference.com 上严格别名规则的前两个例外说:
- AliasedType 是(可能是 cv 限定的)DynamicType
- AliasedType 和 DynamicType 都是(可能是多级的,可能在每一级都有 cv 限定)指向同一类型 T(C++11 起)的指针
我不清楚这些情况之间的区别。 例如:
struct B { virtual ~B() {} };
struct D : B {};
B* b = new D;
reinterpret_cast<D*>(b);
上面的代码是否适合这两种情况?
据我所知,AliasedType 和 DynamicType 都是 D(第一种情况),它们是指向同一类型 D 的指针。
如果我错了,您能否为每个单独的案例提供示例并更清楚地解释差异?
【问题讨论】:
-
cppreference 在这里是错误的。无论对象的动态类型如何,您都不能
reinterpret_cast将基指针指向派生指针或返回,然后取消引用转换后的指针。 -
@n.m.你能提供任何对该标准的参考吗?
-
6.9.2p4。 “如果...,两个对象 a 和 b 是指针可互转换的。”仅允许第一个基类子对象且仅当对象具有标准布局时。
-
当
static_cast或dynamic_cast(检查运行时间)可以工作时,为什么还要使用reinterpret_cast? -
6.10p8 没有给你 reinterpret_cast 任何东西的许可。它说您可以通过其动态指针类型或通过指向其基类之一的指针来访问对象。它并没有说它们必须通过 reinterpret_cast 相互转换(它不可能这么说,因为以这种方式实现继承和重新解释强制转换是不可能的,或者至少没有现有的实现以这种方式实现它们) .
标签: c++ inheritance reinterpret-cast strict-aliasing