将std :: array <pod,n =“”>放入联合中是否安全?</pod,>

时间:2014-02-13 18:50:59

标签: c++ arrays c++11 stl

我有一个像这样的联盟:

union
{
    int all[4];
    struct
    {
        int a, b, c, d;
    };
};

all数组的要点只是简单地对4个字段进行迭代。

为了使它更简单,我想用std::array<int, 4>替换它。这会让我接触到nasal demons吗?

1 个答案:

答案 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

因此,不仅可以首先存在联合,而且可以随意读取和写入任何一个成员。

因此,我的结论是:是;这是安全的