为什么C++20不支持无序的指定初始值设定项?
当我阅读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。
相关文章