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
的指针。
如果我错了你能为每个单独的案例提供例子并更清楚地解释其中的差异吗?
答案 0 :(得分:2)
要理解那里的陈述,你必须意识到button:focus {
-webkit-appearance: none;
border-radius: 0;
background-color: yellow;
font-size: 30px;
padding: 2px 20px;
}
指的是对象的类型,DynamicType
指的是用于访问该表达式的表达式的类型值。但演员本身不是从AliasedType
到DynamicType
,而是从AliasedType
到DynamicType*
。
现在,C ++有多级指针。 AliasedType*
可以是DynamicType
,A*
可以是AliasedType
,可能是cv限定的。因此,B*
将是DynamicType*
。这就是你需要第二种情况的原因。 A**
可以是AliasedType
,与A const*
不同。因此,它不在第一条规则的范围内(A*
不是A const*
的cv限定版本,与A*
不同。
现在,至于您的代码:对象的A* const
为DynamicType
,这在D
中非常明显。 new D
不是指针类型,它是类类型。这意味着只有符合cv标准的变体才能对其进行别名:D
,volatile D
和const D
。
但是,您没有指向该const volatile D
对象的指针,您有一个指向其D
子对象的指针。该子对象可以由B
等别名
您正在尝试使用B const
B
访问AliasedType
子对象。这不起作用 - D
不是符合条件的D
。它们与继承有关,而不是cv资格。