这种类型的双关语是否合法和安全



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

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];
}
我的

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

从不活跃的工会成员那里读取是不定义的行为。

工会中一次只能有一个成员处于活动状态。

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

也许可以产生一个合法有效的operator[](size_t),但不能通过union

最新更新