如果AB这两个类都属于standard layout,并且B定义为

class B {
  // any methods
  A a;
}

那是安全的
A a;
B* b = reinterpret_cast<B*>(&a);

如果现在用A替换std::pair<T1, T2>,那么这对于每种可能的T1, T2也都适用吗?据我所知,如果std::pair<T1, T2>T1都属于标准布局,则T2属于标准布局,但是如果不是,则在这种情况下会影响安全reinterpret_cast的可能性吗?

最佳答案



不,在这种情况下甚至无法使用。



一点也不。强制转换在两种情况下均无效。

您违反了非正式的严格别名规则。更具体地说,根据标准,您正在将指向对象(此处为&a,其中a是对象)的指针转换为B*。由于您没有对象B*,因此尝试取消引用B的任何尝试都将是UB。

您可能认为您有一个对象,但实际上,按照标准,您没有。从[intro.object]p1:



这些情况均不适用,因此,如果您尝试使用不是一个的“object” b,则拥有UB。

现在,您应该咨询您的实现,因为许多实现为诸如IIRC之类的结构提供了基本保证。

09-10 00:04
查看更多