簡體   English   中英

為什么 C++20 不支持亂序指定初始值設定項?

[英]Why C++20 doesn't support out-of-order designated initializer?

在閱讀C++ 參考時,我對這一段有疑問:

注意:亂序指定初始化、嵌套指定初始化、指定初始化器和常規初始化器的混合、數組的指定初始化在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 = {.ax = 0}; // valid C, invalid C++ struct A c = {.x = 1, 2}; // valid C, invalid C++

基本原理:在 C++ 中,成員以相反的構造順序銷毀,初始化列表的元素按詞法順序計算,因此必須按順序指定字段初始化程序。 數組指示符與 lambda 表達式語法沖突。 很少使用嵌套指示符。

提案第一次修訂也討論了這個話題:

為了滿足保證復制省略的這些期望,我們要求指示符作為數據成員聲明序列的子序列出現,以便評估順序與聲明順序匹配,並且在指定初始化中也是從左到右的文本

您可以在此處獲取最新修訂版。

只有一小部分來自 C 的指定初始化選項是痛苦的。 也許將來會得到糾正。 目前,一些編譯器的嚴格程度低於 C++20 標准。 這個片段:

struct A {int x, y;};
A a = {.y=2, .x=4};

編譯時發出警告並在clang-10.0.0和更新版本中運行良好(請參閱https://godbolt.org/z/Ybnzz5chx )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM