我正在滚动自己的结构来表示颜色,这就是我想出的:
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
。