在类似联合类中的`this`上的`reinterpret_cast`是一个未定义的行为吗?

时间:2018-01-16 09:02:47

标签: c++ undefined-behavior unions

请考虑以下代码:

#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未定义行为的指针?

1 个答案:

答案 0 :(得分:4)

这是未定义的行为。作为概述,联合包含uint32_tB

  • 如果它是B,那么演员表是非法的(因为它不是uint32_t你不能施展它)。
  • 如果是uint32_t,则调用.c()成员是非法的,因为您无法访问b1成员(不是活跃的工会成员)。

在这种情况下(感谢@StoryTeller's注释),活动的联盟成员是auint32_t),因为它是唯一一个默认初始化的人,因此调用a.b1.c()是UB。