为什么C++20不支持无序的指定初始值设定项?

2022-05-16 00:00:00 c++ c++20 designated-initializer

当我阅读C++ reference时,我对这一段有一个问题:

注意:无序指定初始化,嵌套指定 初始化、指定的初始值设定项和规则的混合 初始化式,数组的指定初始化都是 在C编程语言中支持,但在C++中不允许。

是否存在阻止C++支持无序指定初始化的技术原因?


解决方案

是的,其基本原理已在附件C(参考资料)中介绍 兼容性具体[diff.dcl]p10(重点挖掘):

受影响的子句:[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-Expression语法冲突。 嵌套指示符很少使用。

first revision of the proposal也讨论此主题:

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

您可以获取最新版本here。

相关文章