我想确定以下
int i{};
double x{};
将所有变量初始化为0.我的编译器似乎在所有模式中都这样做,但我需要确保标准明确说明它。
欢迎任何对C ++ 11标准的引用。
答案 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)