对纪尧姆·瑞秋的评论感到困惑,这里。公共初始序列在这里有问题吗?至少我用GCC 10.1x86-64 (-O3 --std=c++20 -pedantic -Wall -Werror)写了.words,读了.bytes.
sizeof(MyUnion)==32也令人放心。
union MyUnion {
static constexpr std::size_t size = 32;
using byte = std::uint8_t;
using word = std::uint32_t;
std::array<byte, size> bytes;
std::array<word, size / sizeof(word)> words;
};
static_assert(sizeof(MyUnion)==32);发布于 2021-02-07 19:10:12
标准说:
array.overview ..。数组是一个连续容器。..。 数组是一个聚合,可以使用最多N个元素初始化列表,其类型可转换为T。 如果T是一种结构类型,则
array<T, N>是一种结构类型。
标准并没有明确说明std::array的成员。因此,我们在技术上不能假设它具有任何类型的公共初始序列。
从std::array上显示的需求来看,我们可以合理地假设它有一个T[N]类型的成员。如果这个假设是正确的,那么让我们来探究是否有一个共同的初始序列。
class.mem.general 两个标准布局结构(class.prop)类型的公共初始序列是按声明顺序排列的非静态数据成员和位字段的最长序列,从每个结构中的第一个此类实体开始,使得对应的实体具有与布局兼容的类型、.basic.types.general cv1 T1和cv2 T2两种类型是布局兼容类型,如果T1和T2类型相同,则为布局兼容枚举或布局兼容标准布局类类型。
std::uint8_t[32]和std::uint32_t[8]不是相同的类型(忽略cv限定符),枚举和类也不是。因此,它们不是与布局兼容的类型,因此它们不能是相同的公共初始序列的一部分。
结论:不存在是否能安全地承担std::array成员的共同起始序列。
我写.words,读.bytes
程序的行为是没有定义的。
考虑到您希望将它读入(未签名的)字符数组,那么重新解释而不是联合双关语是安全的:
static constexpr std::size_t size = 32;
using word = std::uint32_t;
std::array<word, size / sizeof(word)> words {
1, 2, 3, 4,
};
std::uint8_t* bytes = reinterpret_cast<std::uint8_t*>(words.data());如果你想要一个范围:
std::span<std::uint8_t, size> bytes_range {
bytes, bytes + size,
};https://stackoverflow.com/questions/66091817
复制相似问题