联合中的标量成员是否计入公共初始序列?

2024-01-02

In the union U下面,如果a or b是活动成员,是否定义了访问行为c?

struct A{
    int a;
};
struct B{
    int a;
    double b;
};
union U{
    A a;
    B b;
    int c;
};

In [类.联盟] https://timsong-cpp.github.io/cppwp/n4659/class.union#1,该标准定义了一些规则来使用union更轻松 (emphasis mine):

[ 注:为了简化联合体的使用,做出了一项特殊保证:如果一个标准布局联合体包含多个标准布局联合体structs共享共同的初始序列,并且如果此标准布局联合类型的对象的非静态数据成员处于活动状态并且是标准布局之一structs,允许检查任何标准布局的公共初始序列struct会员;请参阅[class.mem]。 ——《尾注》

我被这个词挂断了struct这里。标准布局标量是否像int即使它不是一个结构体也能计数?

  • My union U上面确实是一个“标准布局”联合,如下[class] https://timsong-cpp.github.io/cppwp/n4659/class这基本上是说它需要是一个使用union相反,由于我们只使用标量(标准布局类型),因此它通过了。

  • 这些结构显然共享一个共同初始序列 https://timsong-cpp.github.io/cppwp/n4659/class.mem#def:common_initial_sequence由第一个组成int成员,但尚不清楚基本类型是否可以考虑用于常见的初始序列。

    • [类.联盟] https://timsong-cpp.github.io/cppwp/n4659/class.union#2还说“每个非静态数据成员的分配就好像它是结构体的唯一成员一样。”我认为这提供了它已被定义的证据。
  • 最后,标准布局结构不允许在开头有填充([类.mem] https://timsong-cpp.github.io/cppwp/n4659/class#mem-24),并且工会的成员是指针可互换 https://timsong-cpp.github.io/cppwp/n4659/basic.compound#4所以标准告诉我们int标准布局结构中的元素和非静态int c在联盟中保证对齐。

struct A and struct B are:

  • 包含在标准布局中union U,
  • 标准布局结构,以及
  • 共享一个共同的初始序列。

因此,它们满足“如果标准布局联合包含多个共享公共初始序列的标准布局结构体”这句话中的描述。

The int c也在联合中的不是这样的结构,也不在这样的结构中。所以这句话并不是告诉你可以写信给c并检查a.a or b.a,也不能写信给a.a or b.a并检查c.

这意味着c不是您可以检查的常见初始序列的一部分。但它也不会破坏常见的初始序列struct A and struct B.

关于文本“每个非静态数据成员的分配就好像它是结构体的唯一成员一样”,该标准在这里的语言有点草率。分配通常是指获取或保留存储,但这种用法似乎是指在给定的存储中布置对象的字节。我在 C++ 标准中没有看到正式的定义(但我没有太努力地寻找),但我确实找到了类似的用途。所以我认为它的意思是每个非-静态数据成员的布局就好像它是唯一的成员一样。

这说明指向这些联合成员中的任何一个的指针与指向任何其他联合成员的指针都指向同一位置。这可能意味着指向一个的指针可以转换为指向另一个的指针。但是,它并不授予您违反严格别名规则的许可。即使x是一个指向c and y是一个指向a or a.a,你不能使用*x访问c while a是最后写入的成员或使用*y while c是最后写入的成员。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

联合中的标量成员是否计入公共初始序列? 的相关文章

  • Windows 10 Mobile (10.0.14393) 地理围栏后台任务 (LocationTrigger)

    自从10 0 14393 周年纪念更新 LocationTrigger似乎不起作用 我有 Windows Phone 8 1 应用程序 也适用于 UWP 应用程序 输出到的便携式库Windows Runtime Component图书馆 w
  • 通过增加索引之和来生成排序组合的有效方法

    对于启发式算法 我需要一个接一个地评估特定集合的组合 直到达到停止标准 由于它们很多 目前我正在使用以下内存高效迭代器块生成它们 受到 python 的启发 itertools combinations http docs python o
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数?

    我正在使用外部库 pcl 因此我需要一个不会更改现有函数原型的解决方案 我正在使用的一个函数生成一个std vector
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 2D morton 码编码/解码 64 位

    如何将给定 x y 的莫顿代码 z 顺序 编码 解码为 32 位无符号整数 生成 64 位莫顿代码 反之亦然 我确实有 xy2d 和 d2xy 但仅适用于 16 位宽的坐标 产生 32 位莫顿数 在网上查了很多 但没有找到 请帮忙 如果您可
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • C 中带有指针的结构的内存开销[重复]

    这个问题在这里已经有答案了 我意识到当我的结构包含指针时 它们会产生内存开销 这里有一个例子 typedef struct int num1 int num2 myStruct1 typedef struct int p int num2
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 在 C++17 中使用 成员的链接错误

    我在 Ubuntu 16 04 上使用 gcc 7 2 并且需要使用 C 17 中的新文件系统库 尽管确实有一个名为experimental filesystem的库 但我无法使用它的任何成员 例如 当我尝试编译此文件时 include
  • C语言声明数组没有初始大小

    编写一个程序来操纵温度详细信息 如下所示 输入要计算的天数 主功能 输入摄氏度温度 输入功能 将温度从摄氏度转换为华氏度 独立功能 查找华氏度的平均温度 我怎样才能在没有数组初始大小的情况下制作这个程序 include
  • 为什么文件更新时“如果较新则复制”不复制文件?

    我在 Visual Studio Express 中有一个解决方案 如下所示 The LogicSchemaC 中的类 将在运行时解析指定的 XML 文件 以下是在main的方法Program cs LogicSchema ls new L
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过

随机推荐

  • 如何从Powershell调用批处理脚本?

    我有一个大批处理脚本 它设置一堆环境变量 我想从 powershell 调用该批处理脚本 这样我就可以获得脚本和 powershell 设置的环境变量的好处 如果你抓住了PowerShell 社区扩展 https github com Ps
  • 延迟限制 http api 调用

    我正在尝试对 REST API 实施一些限制 A典型方法 http django tastypie readthedocs org en latest throttling html在某个阈值之后阻止请求 带有403 or 429回复 然而
  • 如何部署:安装夹层主题

    如何准确 一步一步地安装 Mezzanine 主题 E g 现代免费主题 https github com thecodinghouse mezzanine themes 前提条件 0 版本控制 Python 2 7 6 Django 1
  • Node Express 中间件在一次调用中输出 console.log() 两次?

    只是一个关于某些 Node Express 中间件的简单问题 该中间件在我的节点 cmd 提示符中输出 1 个对 console log 的调用两次 它只是没有意义 想知道是否有人可以解释为什么这种情况发生在我身上 服务器 js var e
  • C# 表单控件移动

    是否有办法控制可以移动表单的位置 因此 如果我移动表单 它只能在垂直轴上移动 当我尝试水平移动它时 什么也不会发生 我不想要一个有缺陷的实现 比如位置更改或移动事件并将其内联弹出 我没有办法使用 WndProc 覆盖之类的东西 但搜索了一段
  • 为什么 C# 4.0 允许匿名对象初始化代码中的尾随逗号? [复制]

    这个问题在这里已经有答案了 可能的重复 内联属性初始化和尾随逗号 https stackoverflow com questions 5245152 inline property initialisation and trailing c
  • 如何根据给定的计数动态添加单选按钮?

    我已经尝试过这段代码 当模拟器启动时 它将在一行中显示三个单选按钮 但我需要一个按钮事件 IE 如果我单击该按钮 它应该询问单选按钮的数量 那么如果我给出计数 它必须根据给定的计数显示单选按钮 例如 如果我将计数指定为 3 则它必须在一行中
  • 为类模板声明用户定义的 OpenMP 缩减

    使用 OpenMP 时 我想为类模板声明用户定义的缩减 include
  • 如何在 Prometheus 或 Grafana 上编写“或”逻辑运算符

    我需要编写一个使用我定义的任何不同作业的查询 job traefik OR job cadvisor OR job prometheus 是否可以编写逻辑二元运算符 普罗米修斯有一个or逻辑二元运算符 但您在这里问的是向量选择器 您可以为此
  • 当 UserControl 更改可见性时聚焦于 TextBox

    我在画布内加载了一个用户控件 默认情况下 此用户控件的可见性已折叠 当我的窗口的特定文本框聚焦时 用户控件变得可见 当用户控件变得可见时 我想将焦点设置到用户控件内的另一个文本框 我尝试这样做 private void UserContro
  • 从 USRP N210 设备检索数据

    N210 连接到 RF 前端 该前端使用 GNU Radio Companion 进行配置 我可以通过 FFT 图看到信号 我需要接收到的信号 usrp2 输出 作为数字 usrp sense spectrum py 也将功率和噪声地板输出
  • 即使有 0 个连接,Aws Aurora Serverless v2 也不会缩减至 0.5 ACU

    我正在运行一个 v2 实例 并且根据 aws 文档 您应该只为实际使用的资源付费 我有一个实例 大多数时候连接数为 0 但它永远不会缩减到 2 个 ACU 以下 请参阅下面的图片以供参考 我的实例设置在 0 5 16ACU 之间扩展 但负载
  • 如何更改使用“rails new”命令创建的默认 gemfile?

    我最近遇到一个问题 我必须将以下内容添加到我的 gemfile 中 gem execjs gem therubyracer 我必须这样做以避免启动 Rails 服务器时发生 JavaScript 运行时错误 我希望将此修改添加到使用 Rai
  • 评估具有许多未知因素的项目

    我正在开展一个具有许多未知因素的项目 例如将应用程序从一个平台移动到另一个平台 我最初的估计有很大偏差 我无法真正确定这一切何时结束 我该如何处理无法评估这样的项目的情况 这并不是说我要在屏幕上添加一个按钮或设计一个网站 或创建应用程序 甚
  • run()方法后线程继续运行

    我在游戏中播放声音时遇到问题 当处理声音播放的线程退出它的 run 方法时 它不会终止 结束 停止 我知道正是这种方法导致了问题 因为当我将整个事情注释掉时 就不会创建更多线程了 用 JVisualVM 检查 问题是退出 run 方法后线程
  • 在 UWP 应用程序上使用 VB.net 获取 IPGlobalProperties

    我正在 Visual Studio 2017 中使用 VB 编写一个非常简单的通用 Windows 应用程序 该应用程序应该向用户提供基本的网络信息 因此我想使用以下方式收集数据IPGlobalProperties并打印 作为第一个例子 D
  • 如何将种子数据放入SQL Server docker镜像中?

    我有一个使用 ASP NET Core 和 SQL Server 的项目 我正在尝试将所有内容放入 docker 容器中 对于我的应用程序 我需要在数据库中有一些初始数据 我可以使用来自 microsoft microsoft mssql
  • 如何在react-native中实现刮刮卡/视图?

    我正在寻找一个包来在反应本机中实现刮刮卡 我找到了这个图书馆https github com thebylito react native scratch card https github com thebylito react nati
  • 我可以在云函数中以管理员身份使用通配符查询 firestore 吗?

    exports updateRelatedCards functions firestore document topic newTopic onWrite snap context gt const newTopic snap data
  • 联合中的标量成员是否计入公共初始序列?

    In the union U下面 如果a or b是活动成员 是否定义了访问行为c struct A int a struct B int a double b union U A a B b int c In 类 联盟 https tim