我正在滚动我自己的结构来表示颜色,这就是我提出的:
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>
答案 0 :(得分:3)
从非活动联盟的成员中读取未定义的行为。
一次只能有一个工会成员。
前缀的布局兼容性是一个例外,但数组与任何struct
的布局不兼容
根据标准有多个成员。
有可能产生合法效率operator[](size_t)
,但不能通过union
。