为什么C++20不支持乱序指定初始化器?

2024-01-02

当我读书的时候C++参考 https://en.cppreference.com/w/cpp/language/aggregate_initialization#Designated_initializers,我对这一段有一个疑问:

注:乱序指定初始化、嵌套指定 初始化,指定初始化器和常规初始化器的混合 初始化器和数组的指定初始化都是 C 编程语言支持,但 C++ 不允许。

是否有任何技术原因阻止 C++ 支持乱序指定初始化?


是的,其基本原理包含在附录 C(资料性) 兼容性具体来说[diff.dcl]p10 http://eel.is/c++draft/diff.dcl#10 (强调我的):

受影响的子条款:[dcl.init.aggr] 更改:在 C++ 中,指定 与相应的初始化支持相比,初始化支持受到限制 C 中的功能。在 C++ 中,非静态数据成员的指示符必须在申报顺序中指定, 数组元素的指示符 和嵌套指示符不受支持,并且指定和 非指定初始化器不能混合在同一个初始化器中 列表。例子:

struct A { int x, y; };
struct B { struct A a; };
struct A a = {.y = 1, .x = 2};  // valid C, invalid C++
int arr[3] = {[1] = 5};         // valid C, invalid C++
struct B b = {.a.x = 0};        // valid C, invalid C++
struct A c = {.x = 1, 2};       // valid C, invalid C++

理由:在 C++ 中,成员按相反的构造顺序被销毁,并且初始值设定项列表的元素按词法顺序求值,因此必须按顺序指定字段初始值设定项。数组指示符与 lambda 表达式语法冲突。 很少使用嵌套指示符。

The 提案第一次修订 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0329r0.pdf也讨论了这个话题:

为了满足保证复制省略的这些期望,我们要求指示符出现 作为数据成员声明序列的子序列,以便求值顺序 与声明顺序匹配,并且在指定初始化中也是文本从左到右

您可以获取最新版本here https://wg21.link/p0329.

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

为什么C++20不支持乱序指定初始化器? 的相关文章

随机推荐

  • Abp.io异常:激活Castle.Proxies.ProcessesServiceProxy时抛出异常

    我还是个新人Abp io http Abp io 并且我收到以下异常 我按照 Abp io 文档中的说明进行操作 请您帮助我知道我错过了什么 2019 10 10 14 01 46 644 03 00 ERR An exception wa
  • Html.ValidationMessageFor 文本颜色

    可能是一个简单的问题 但我似乎找不到答案 使用 MVC 2 我有一系列 Html ValidationFor 控件 我想为文本分配一个 CSS 类 但似乎无法做到 如果我尝试与文本框相同的方法 因为我会收到错误 因为它需要一个字符串 当我在
  • PersistentVolumeClaim 未绑定:“nfs-pv-provisioning-demo”

    我正在仅使用一个节点建立一个 kubernetes 实验室并学习设置 kubernetes nfs 我从以下链接逐步遵循 kubernetes nfs 示例 https github com kubernetes examples tree
  • Windows 7 上的 Mysql 时区未更新

    我在用着Windows 7的 mysql 5 5 15 running set time zone Europe Moscow I get Error Number 1298 Unknown or incorrect time zone E
  • 如何将项目文件夹中的用户控件添加到工具箱

    我正在开发一个 Windows 窗体项目视觉工作室2012 在项目的解决方案中 我创建了一个名为的新文件夹userControls并向其添加用户控件 UserControl1 这是解决方案的树视图 我怎样才能访问UserControl在该文
  • 如何在 Android 上从 USB 设备读取文件?

    我正在尝试通过连接的 USB 设备 通过 OTG 或 android TV 上的 USB 端口 创建类似文件资源管理器的东西 我所需要的只是一个类似于 storage sda4 的路径和设备标识符 然后我可以通过简单的 android 类文
  • make_heap 有什么意义?

    有人可以告诉我 STL 堆函数模板的要点吗std make heap 为什么有人会使用它们 有实际用途吗 算法和数据结构课程可以很好地回答你的直接问题 堆在计算机科学的算法中随处可见 引用下面链接的 make heap 函数 堆是一棵树 其
  • jQuery Sortable - 如何获取当前拖动的元素属性

    我正在使用 jqueryui 可排序小部件 我需要获取当前拖动元素的数据属性 this data attribute name 在这里不起作用 我也尝试过其他一些方法 但没有得到正确的结果 HTML ul class draggable i
  • 使用 Python 转义 XPath 文字

    我正在编写一个通用库来使用 Selenium 2 0 Python 的 webdriver 设置自动化测试套件 def verify error message present self message try self driver fi
  • foreach 循环的写入进度问题

    这可能是一个非常简单的答案 我无法让写入进度正常工作 我相当确定问题出在我的变量上 但我似乎无法弄清楚到底是什么 它现在所做的是在没有输出文件存在时在第一次运行时进行炸弹攻击 它会告诉我 Write Progress Cannot vali
  • +*argv、*argv++、*(argv++) 和 *(++argv) 之间的区别

    目前我正在学习 C 并试图理解这些说明 它们实际上不同吗 argv argv argv argv Thanks 后缀增量运算符的优先级高于指针取消引用运算符 而不是前缀增量 所以这两个是等价的 p p 前缀递增的优先级与 相同 因此 p递增
  • 获得组中的最大行数?

    我需要获取每组UID中的最大ID ID UID 23 1 24 1 25 2 26 2 会给出 ID UID 24 1 26 2 如何获得每组中的最大行数 Use the MAX http dev mysql com doc refman
  • Android 短信意图环聊 2.0

    从 Hangouts 2 0 开始 Google 已经破坏 或未记录 如何通过 Intent 从第三方应用程序发送短信正文 这使得在 4 4 上通过应用程序的 Intent 发送短信完全失效 以下 Intent 不起作用 Intent sm
  • Android以太网使用dhcp配置IP [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我有一个带有以太网接口的安卓盒子 android SDK 中没有用于配置以太网的 Java 类 作为最后的手段 我使用 shell 命令来配置以太网
  • 直接从 jar 文件启动 Java applet

    目标是从 jar 文件运行小程序 问题是该小程序似乎只想从分解的 jar 文件运行 Internet 上的示例建议使用此小程序标签 这甚至不会尝试查看 jar 文件并失败 Caused by java io IOException open
  • 从 .NET 程序获取全局根

    我最近开始使用 ANTS 分析工具进行生产工作 除了对它们的强大感到惊讶之外 我忍不住想知道它们是如何工作的 例如 最有用的功能之一可以让您可视化正在运行的程序的全局根 以及对不同类型值的引用数量 这个工具如何获取这些信息 全面披露 我是
  • 在 Firebase 中创建空子记录

    我正在尝试使用 Firebase 数据视图创建一个子节点 但似乎这是不可能的 因为创建节点直接消失或者随时不显示 我尝试将值字段留空 但这根本不起作用 就像将 null 写入值字段一样 我做错了吗 Fabian Null 和空值与不存在的记
  • emacs lisp 和 c-mode:我什么时候在评论区

    我想在 c c 缓冲区中搜索正则表达式 但我想避免表达式与注释区域匹配 有没有办法使用 c 模式来知道一堆文本是否在注释区域内 或一个点是否在注释区域内 解决这个问题的方法是syntax ppss它适用于 C C 和大多数主要模式 例如 n
  • SequelizeEagerLoadingError 与 Sequelized

    我在尝试运行 Sequelized 查询时遇到错误 当我只询问用户时 该查询有效 但当我添加 包含 并尝试与另一个表 博客表 连接时 该查询会中断 这是我的用户模型 const Model DataTypes require sequeli
  • 为什么C++20不支持乱序指定初始化器?

    当我读书的时候C 参考 https en cppreference com w cpp language aggregate initialization Designated initializers 我对这一段有一个疑问 注 乱序指定初