Skip to main content
 首页 » 编程设计

c++之为什么C++ 20不支持乱序的指定初始化程序

2024年12月31日17三少

在阅读C++ reference时,我对本段有疑问:

Note: out-of-order designated initialization, nested designated initialization, mixing of designated initializers and regular initializers, and designated initialization of arrays are all supported in the C programming language, but are not allowed in C++.



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

请您参考如下方法:

是的,理由在附件C中提供(资料性)
兼容性特别是[diff.dcl]p10(强调我的):

Affected subclause: [dcl.init.aggr] Change: In C++, designated initialization support is restricted compared to the corresponding functionality in C. In C++, designators for non-static data members must be specified in declaration order, designators for array elements and nested designators are not supported, and designated and non-designated initializers cannot be mixed in the same initializer list. Example:

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++ 

Rationale: In C++, members are destroyed in reverse construction order and the elements of an initializer list are evaluated in lexical order, so field initializers must be specified in order. Array designators conflict with lambda-expression syntax. Nested designators are seldom used.



first revision of the proposal也讨论了这个主题:

To meet these expectations for guaranteed copy elision, we require the designators to appear as a subsequence of the data member declaration sequence, so that the evaluation order matches the declaration order, and it is also textually left­to­right in designated initialization



您可以获取最新修订版 here