C++ 中的联合(请解释)

AM *_*M Z 1 c++ struct unions

#include <iostream>

#define print(x) std::cout << x
#define println(x) std::cout << x << std::endl

struct Vector2 {
    float x, y;
};

struct Vector4 {
    union {
        struct {
            float x, y, z, w;
        };
        struct {
            Vector2 a, b;
        };
    };
};

void PrintVector2(const Vector2& vector) {
    println(vector.x << ", " << vector.y);
}

int main() {
    Vector4 vector = { 1, 2, 3, 4 };
    vector.x = 2;
    vector.z = 500.0f;
    PrintVector2(vector.a);
    PrintVector2(vector.b);
}
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这段代码发生了什么?,我不明白工会是什么以及它们是如何工作的:/!

这是输出

2, 2
500, 4
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 5

代码的行为是未定义的。

这只不过是一个精心设计的联合类型双关语。这是 C++ 标准不允许的,因为 C++union具有active member的概念。一旦设置了活动成员,就不能以定义的方式读取另一个成员。(您当然可以通过重新分配来更改活动成员。)

谷歌我用斜体表示的术语:这里没有更深入的意义。

  • 请注意,在 C 中这也将是未定义的行为。 (2认同)
  • @gnasher729:尽管出于不同的原因。谢天谢地,这不是多标签的。 (2认同)