我有一个像这样的联盟:
union
{
int all[4];
struct
{
int a, b, c, d;
};
};
all
数组的要点只是简单地对4个字段进行迭代。
为了使它更简单,我想用std::array<int, 4>
替换它。这会让我接触到nasal demons吗?
答案 0 :(得分:4)
首先,重要的是要注意,在联合中只有两个不同类型的对象从不未定义。未定义的是写入一个并从另一个读取,但有一个例外:
[C++11: 9.5/1]:
[注意:为了简化联合的使用,我们做了一个特别的保证:如果标准布局联合包含几个共享一个共同初始序列的标准布局结构(9.2),如果这个标准布局联合类型的对象包含一个标准布局结构,则允许检查任何标准布局结构成员的公共初始序列;见9.2。 - 结束记录] [..]
现在,尽管std::array
符合此规则的任何地方都没有专门写出,但它只是一个只有元素成员的聚合这一事实似乎足以保证:
[C++11: 23.3.2.1/2]:
数组是一个聚合(8.5.1),可以用语法初始化:
array<T, N> a = {
初始化列表};
其中初始化列表是逗号分隔的最多
N
元素列表,其类型可转换为T
。
因此,不仅可以首先存在联合,而且可以随意读取和写入任何一个成员。
因此,我的结论是:是;这是安全的。