卷括号初始化没有任何值

时间:2015-09-18 09:40:04

标签: c++ c++11 list-initialization

写这样的东西可以吗

typedef unsigned long DWORD;
DWORD nBytesRead = {};

此变量在此表达式后是否包含0?

2 个答案:

答案 0 :(得分:5)

是的,这是合法的。标准说(5.17.9):

  

braced-init-list可能出现在右侧   赋值给标量,在这种情况下,初始化列表应具有   最多只有一个元素。 x = {v}的含义,其中T是标量   表达式x的类型是x = T(v)的类型,除了没有变窄   转换(   8.5.4)是允许的。 x = {}的含义是x = T()

答案 1 :(得分:5)

是的,没关系,保证nBytesRead将包含零值。您使用空的初始化列表复制初始化nBytesRead,对于非类类型,这意味着您对其进行零初始化。零初始化意味着您认为它意味着什么。

您正在做的事情称为 list-copy-initialization 。来自[dcl.init]:

  

大括号或等于初始化程序或[...]的=形式的初始化称为复制初始化

来自[dcl.init.list]:

  

列表初始化是从 braced-init-list 初始化对象或引用。这样的初始化程序是   称为初始化列表,列表中逗号分隔的 initializer-clauses 称为元素   初始化列表。初始化列表可以为空。列表初始化可以在直接初始化或复制初始化中进行   上下文;直接初始化上下文中的列表初始化称为 direct-list-initialization 和   复制初始化上下文中的列表初始化称为 copy-list-initialization

其中:

  

类型T的对象或引用的列表初始化定义如下:
   - 如果T是班级类型和[...]
   - 否则,如果T是一个字符数组并且[...]
   - 否则,如果T是聚合,[...]
   - 否则,如果初始化列表没有元素且T是类类型[...]
   - 否则,如果T是std :: initializer_list的特化,[...]
   - 否则,如果T是类类型,[...]
   - 否则,如果初始化列表具有单个元素[...]
   - 否则,如果T是参考类型,[...]
   - 否则,如果初始化列表没有元素,该对象是值初始化

对于非类类型,值初始化表示[dcl.init]:

  

value-initialize T类型的对象意味着:
   - 如果T是一个(可能是cv限定的)类类型,没有默认构造函数[...]
   - 如果T是(可能是cv限定的)类类型而没有用户提供或删除的默认构造函数[...]
   - 如果T是数组类型,[...]
   - 否则,该对象为零初始化。

零初始化意味着,[dcl.init]:

  

T类型的对象或引用进行零初始化意味着:
   - 如果T是标量类型(3.9),将对象初始化为通过转换整数文字获得的值   0(零)到T