代码之家  ›  专栏  ›  技术社区  ›  HugoTeixeira

C++中的空嵌套初始化列表

  •  0
  • HugoTeixeira  · 技术社区  · 7 年前

    struct S {
        float b;
        int a;    
    };
    
    int main() {
        S s{{{}}};
        return s.a;
    }
    

    Godbolt

    叮当6.0.0

    <source>警告:标量初始值设定项[-Wmany braces around scalar init]

    不编译此代码并报告错误:

    <source>:在函数“int main()”中: <source>:9:10:错误:类型“float”的标量初始值设定项周围有大括号

    哪一个是正确的?规范对此有何规定?

    2 回复  |  直到 7 年前
        1
  •  1
  •   NathanOliver    7 年前

    无需诊断

        2
  •  1
  •   Community Mohan Dere    6 年前

    规范对此有何规定?

    dcl.init.aggr/3 :

    3当聚合由中指定的初始值设定项列表初始化时[dcl.init.list目录],初始值设定项列表的元素将作为聚合元素的初始值设定项。聚合的显式初始化元素确定如下:

    3.1如果初始值设定项列表是指定的初始值设定项列表,则聚合应为类类型,每个指示符中的标识符应命名类的直接非静态数据成员,聚合的显式初始化元素是属于或包含这些成员的元素。

    3.2如果初始值设定项列表是初始值设定项列表,则聚合的显式初始化元素是聚合的前n个元素,其中n是初始值设定项列表中的元素数。

    3.3 否则,初始值设定项列表必须是{} ,并且没有显式初始化的元素。