用{0}初始化结构

时间:2019-10-28 12:08:57

标签: c++ initialization

我正在调试一些与此基本相同的代码:

<Window>
  <Window.DataContext>
    <ViewModel />
  </Window.DataContext>

  <ListView x:Name="ActionFile" 
            ItemsSource="{Binding FileActionEntries}" >
    <ListView.View>
      <GridView>
          <GridViewColumn Header="Number" Width="40" DisplayMemberBinding="{Binding NumberX}"/>
          <GridViewColumn Header="Action" Width="200" DisplayMemberBinding="{Binding ActionX}"/>
          <GridViewColumn Header="File" Width="350" DisplayMemberBinding="{Binding FileX}"/>
      </GridView>
    </ListView.View>
  </ListView>
</Window>

当我创建struct Foo { int a; int b; }; struct Bar { Bar() {} Foo foo{0}; }; 的实例时,似乎Bara都被初始化为零。这样可以保证吗?在规范中哪里可以找到?

1 个答案:

答案 0 :(得分:3)

根据cppreference.com

  

如果初始化程序子句的数量少于成员的数量(和基数(自C ++ 17起)]或初始化程序列表完全为空,则初始化剩余的成员[和基数(自C ++ 17起)] [由默认的成员初始化程序(如果在类定义中提供,否则,从C ++ 14开始)]由空列表按照常规的列表初始化规则(对非类类型和非类类型执行值初始化) -带有默认构造函数的类,以及对聚合的聚合初始化)。如果引用类型的成员是其余成员之一,则该程序的格式不正确。

Foo没有默认的成员初始值设定项(int b{0};),因此b将通过带有空列表的列表初始化来初始化,这意味着非类类型的值初始化: b = int() // = 0