【问题标题】:Is it safe to put an std::array<POD, N> in a union?将 std::array<POD, N> 放在联合中是否安全?
【发布时间】:2014-03-12 20:21:58
【问题描述】:

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

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

all 数组的意义在于简化对 4 个字段的迭代。

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

【问题讨论】:

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


    【解决方案1】:

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

    [C++11: 9.5/1]: [ 注意: 为了简化联合的使用,我们做了一个特殊的保证:如果一个标准布局联合包含多个标准布局结构,它们共享一个共同的初始序列(9.2 ),并且如果此标准布局联合类型的对象包含标准布局结构之一,则允许检查任何标准布局结构成员的公共初始序列;见 9.2。 —尾注] [..]

    现在,虽然它没有在任何地方专门写出 std::array 符合此规则,但它是只有元素成员的聚合这一事实似乎足以保证:

    [C++11: 23.3.2.1/2]: 数组是一个聚合(8.5.1),可以使用以下语法进行初始化:

       array&lt;T, N&gt; a = { initializer-list };

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

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

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

    【讨论】:

    • 为了减少混淆,我已将标题更改为“是否 安全 为 ...”,所以我将“不;它是安全的”编辑为“是” ; 它是安全的”。
    • 也许不够。原来布局兼容性是极其严格的。如果没有别的,实际上,四个ints 不是标准布局结构。
    • 等等,struct { int a,b,c,d; } 不是标准布局?他们在争吵。
    • 我认为不能保证 std::array 是标准布局类,我不确定是否可以保证具有四个 int 数据成员的结构与布局兼容原始数组。
    • 对于它的价值,according to g++,联合本身是标准布局,这意味着它认为std::array&lt;int, N&gt; 和“内联结构”都是。如果g++的is_standard_layout符合标准,那么这个构造应该是安全的。
    猜你喜欢
    • 2017-10-01
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    相关资源
    最近更新 更多