当我读书的时候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(使用前将#替换为@)