这种类型的Punning是否合法且安全?

时间:2017-04-14 20:49:34

标签: c++ unions type-punning

我正在滚动我自己的结构来表示颜色,这就是我提出的:

struct Color {
    typedef uint8_t color_t;

    union {
        struct {
            color_t red, green, blue, alpha;
        };
        struct {
            color_t x, y, z, w;
        }
        std::array<color_t, 4> _data;
    };

    /*...*/
};

这个想法是简化编写索引代码的行为。例如,operator[]代码就像这样写:

//I haven't written bounds-checking yet.
constexpr color_t & operator[](size_t i) {
    return _data[i];
}

constexpr color_t operator[](size_t i) const {
    return _data[i];
}

我的理解是这应该是安全的(实际上,这段代码按照我的预期进行编译和运行)但是我在这个假设中实际上是正确的,还是我可能通过编写这样的代码来冒着未定义的行为冒险? / p>

1 个答案:

答案 0 :(得分:3)

从非活动联盟的成员中读取未定义的行为。

一次只能有一个工会成员。

前缀的布局兼容性是一个例外,但数组与任何struct的布局不兼容 根据标准有多个成员。

有可能产生合法效率operator[](size_t),但不能通过union