如果A
和B
这两个类都属于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之类的结构提供了基本保证。