如果两个班级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
都是标准布局,但如果它们不是,那么这会影响安全的可能性{ {1}}在这种情况下?
答案 0 :(得分:1)
如果
A
现在被std::pair<T1, T2>
替换,那么这对每个可能的T1
,T2
都有用吗?
不,它甚至不能在这种特定情况下工作。
这会影响在这种情况下安全
reinterpret_cast
的可能性吗?
完全没有。演员在两种情况下都无效。
您违反了非正式的严格别名规则。更具体地说,根据标准,您将指向对象(此处为&a
,其中a
为对象)指向B*
。由于您没有对象B*
而尝试取消引用B
将是UB。
你可能认为你有一个对象,但实际上,根据标准,你不会。来自[intro.object]p1:
对象由定义([basic.def])创建,由new-expression创建,隐式更改union的活动成员([class.union]),或者何时创建一个临时对象([conv.rval],[class.temporary])。
这些情况都不适用,所以如果你试图使用&#34;对象&#34;你有UB。 b
不是一个。
现在,您应该参考您的实现,因为许多实现为像您的IIRC这样的构造提供了基本保证。