【发布时间】:2014-03-12 20:21:58
【问题描述】:
我有一个这样声明的工会:
union
{
int all[4];
struct
{
int a, b, c, d;
};
};
all 数组的意义在于简化对 4 个字段的迭代。
为了更简单,我想用std::array<int, 4> 替换它。这会让我接触到nasal demons吗?
【问题讨论】:
我有一个这样声明的工会:
union
{
int all[4];
struct
{
int a, b, c, d;
};
};
all 数组的意义在于简化对 4 个字段的迭代。
为了更简单,我想用std::array<int, 4> 替换它。这会让我接触到nasal demons吗?
【问题讨论】:
首先,重要的是要注意,在联合中仅具有两个不同类型的对象是永远未定义的。未定义的是写入一个并从另一个读取,除了一个例外:
[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};其中 initializer-list 是一个逗号分隔的列表,最多可包含
N元素,其类型可转换为T。
因此,不仅一开始就存在联合是安全的,而且随意读写任一成员也是安全的。
因此,我的结论是:是的;它是安全的。
【讨论】:
ints 不是标准布局结构。
struct { int a,b,c,d; } 不是标准布局?他们在争吵。
std::array 是标准布局类,我不确定是否可以保证具有四个 int 数据成员的结构与布局兼容原始数组。
std::array<int, N> 和“内联结构”都是。如果g++的is_standard_layout符合标准,那么这个构造应该是安全的。