首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这个std::数组的联合是否存在公共初始序列的问题?

这个std::数组的联合是否存在公共初始序列的问题?
EN

Stack Overflow用户
提问于 2021-02-07 18:50:15
回答 1查看 102关注 0票数 4

对纪尧姆·瑞秋的评论感到困惑,这里公共初始序列在这里有问题吗?至少我用GCC 10.1x86-64 (-O3 --std=c++20 -pedantic -Wall -Werror)写了.words,读了.bytes.

sizeof(MyUnion)==32也令人放心。

代码语言:javascript
运行
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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

程序的行为是没有定义的。

考虑到您希望将它读入(未签名的)字符数组,那么重新解释而不是联合双关语是安全的:

代码语言:javascript
运行
复制
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());

如果你想要一个范围:

代码语言:javascript
运行
复制
std::span<std::uint8_t, size> bytes_range {
    bytes, bytes + size,
};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66091817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档