[英]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.