写这样的东西可以吗
typedef unsigned long DWORD;
DWORD nBytesRead = {};
此变量在此表达式后是否包含0?
答案 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