将 std::array<POD, N> 放在联合中是否安全?

zne*_*eak 10 c++ arrays stl c++11

我有一个这样声明的工会:

union
{
    int all[4];
    struct
    {
        int a, b, c, d;
    };
};
Run Code Online (Sandbox Code Playgroud)

该点all阵列是单纯为了遍历所有4场简单。

为了使它更简单,我想用一个std::array<int, 4>. 那会让我接触鼻恶魔吗?

Lig*_*ica 8

首先,重要的是要注意,在联合中只有两个不同类型的对象永远不会是未定义的。未定义的是写入一个并从另一个读取,但有一个例外:

[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 = { 初始化列表 };

其中initializer-list是一个逗号分隔的列表,最多N包含类型可转换为 的元素T

因此,不仅首先让联合存在是安全的,而且随意读写任一成员也是安全的。

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

  • 为了减少混淆,我将标题更改为“它*安全* 到……”,因此我将“不;它是安全的”编辑为“是的;它是安全的”。 (2认同)
  • 我认为不能保证 `std::array` 是标准布局类,我不确定是否保证具有四个 `int` 数据成员的结构与原始数组的布局兼容。 (2认同)
  • 对于它的价值,[根据 g++](http://ideone.com/7WFcu3),联合本身是标准布局,这意味着它认为`std::array&lt;int, N&gt;` 和“内联结构”是。如果 g++ 的 `is_standard_layout` 符合标准,那么这个构造应该是安全的。 (2认同)