请考虑以下代码:
#include <cstdint>
struct B {
uint32_t c() {
uint32_t * value = reinterpret_cast<uint32_t *>(this);
return * value;
}
};
struct A {
union {
B b1;
B b2;
uint32_t a { 10 };
};
};
int test() {
A a;
return a.b1.c();
}
这里test()
返回10,因为所有A都是类似联合的结构。我的问题是,假设A满足StandardLayoutType概念,在this
内部转换B::c
以获取指向A::a
未定义行为的指针?
答案 0 :(得分:4)
这是未定义的行为。作为概述,联合包含uint32_t
或B
。
B
,那么演员表是非法的(因为它不是uint32_t
你不能施展它)。 uint32_t
,则调用.c()
成员是非法的,因为您无法访问b1
成员(不是活跃的工会成员)。在这种情况下(感谢@StoryTeller's注释),活动的联盟成员是a
(uint32_t
),因为它是唯一一个默认初始化的人,因此调用a.b1.c()
是UB。