严格别名异常解释

时间:2017-09-23 07:33:38

标签: c++ inheritance reinterpret-cast strict-aliasing

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);

以上代码是否适合这两种情况?

据我所知AliasedTypeDynamicType都是D(第一种情况),它们是同一类型D的指针。

如果我错了你能为每个单独的案例提供例子并更清楚地解释其中的差异吗?

1 个答案:

答案 0 :(得分:2)

要理解那里的陈述,你必须意识到button:focus { -webkit-appearance: none; border-radius: 0; background-color: yellow; font-size: 30px; padding: 2px 20px; } 指的是对象的类型,DynamicType指的是用于访问该表达式的表达式的类型值。但演员本身不是从AliasedTypeDynamicType,而是从AliasedTypeDynamicType*

现在,C ++有多级指针。 AliasedType*可以是DynamicTypeA*可以是AliasedType,可能是cv限定的。因此,B*将是DynamicType*。这就是你需要第二种情况的原因。 A**可以是AliasedType,与A const*不同。因此,它不在第一条规则的范围内(A* A const*的cv限定版本,与A*不同。

现在,至于您的代码:对象的A* constDynamicType,这在D中非常明显。 new D 不是指针类型,它是类类型。这意味着只有符合cv标准的变体才能对其进行别名:Dvolatile Dconst D

但是,您没有指向该const volatile D对象的指针,您有一个指向其D子对象的指针。该子对象可以由B等别名

您正在尝试使用B const B访问AliasedType子对象。这不起作用 - D不是符合条件的D。它们与继承有关,而不是cv资格。