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
。
因此,不仅首先让联合存在是安全的,而且随意读写任一成员也是安全的。
因此,我的结论是:是的;这是安全的。
归档时间: |
|
查看次数: |
1503 次 |
最近记录: |