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>. 那会让我接触鼻恶魔吗?
首先,重要的是要注意,在联合中只有两个不同类型的对象永远不会是未定义的。未定义的是写入一个并从另一个读取,但有一个例外:
[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。
因此,不仅首先让联合存在是安全的,而且随意读写任一成员也是安全的。
因此,我的结论是:是的;这是安全的。