卷括号初始化没有任何值

Fro*_*art 2 c++ c++11 list-initialization

写这样的东西可以

typedef unsigned long DWORD;
DWORD nBytesRead = {};
Run Code Online (Sandbox Code Playgroud)

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

Sin*_*all 5

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

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

  • 这不是引用的正确部分.分配与初始化不同. (3认同)

Bar*_*rry 5

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


你在做什么叫做list-copy-initialization.来自[dcl.init]:

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

来自[dcl.init.list]:

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

哪里:

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

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

值初始化类型的对象T是指:
-如果T是具有或者没有默认的构造(可能CV修饰)类型[...]
-如果T是一个(可能CV修饰)类型不具有用户提供或删除默认构造函数[...]
- 如果T是数组类型,[...]
- 否则,对象被零初始化.

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

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