支持数值类型的初始化。它们是0初始化的吗?

时间:2015-11-25 10:06:31

标签: c++

我想确定以下

int i{};
double x{};

将所有变量初始化为0.我的编译器似乎在所有模式中都这样做,但我需要确保标准明确说明它。

欢迎任何对C ++ 11标准的引用。

3 个答案:

答案 0 :(得分:8)

标准规定了这一点(N3337的所有引用)。

T x{};列表初始化

  

[dcl.init.list]/1:列表初始化是从braced-init-list初始化对象或引用。这样的初始化器是   称为初始化列表,列表中逗号分隔的初始化子句称为元素   初始化列表。初始化列表可以为空。 [...]

列表初始化的适用定义:

  

[dcl.init.list]/3:对象或类型T的引用的列表初始化定义如下:

     
      
  • [许多不适用的规则]
  •   
  • 否则,如果初始化列表没有元素,则对象将进行值初始化。
  •   

因此内置类型的表单是 value-initialization

  

[dcl.init]/7:对T类型的对象进行值初始化意味着:

     
      
  • [不适用规则]
  •   
  • 否则,该对象为零初始化。
  •   

所以现在我们正在寻找零初始化(是的,C ++有 lot 的初始化类型):

  

[dcl.init]/5:零初始化T类型的对象或引用意味着:

     
      
  • 如果T是标量类型(3.9),则将对象设置为值0(零),作为整数常量表达式,转换为T;
  •   
  • [...]
  •   

是的,因为算术类型是标量类型([basic.types]/9,如果你不信任我),这些形式都用0初始化它们的对象。

答案 1 :(得分:3)

是的,这是由标准保证的:这实际上是在执行value-initialization

特别是,请参阅页面上的第4点:它说明它必须是value-initialization

  

在这些情况下执行值初始化:
  ...
  4)当声明一个命名变量(自动,静态或线程局部)时,初始化器由一对括号组成。

在同一页面上,您会看到value-initialization对内置类型的影响是用0初始化它们(方括号是我的):

  

值初始化的影响是:
  ...
  4)否则[如果是非类,非数组类型],则对象为零初始化。

答案 2 :(得分:1)

int i{};表单称为value initialization

Abridged:

  

值初始化的影响是:
  [...]
  4)否则[如果T不是类或数组类型],则对象为零初始化。