[英]Zero initialization of an array in c++ without an equal sign?
我知道int a[10]={0}
和int a[10]={}
但您现在也可以在 c++ 中执行int a[10]{}
来初始化自动变量吗?
这三个都有效,但初始化方法不同。
从 C++11 开始,它是这样的:
={0}
是具有单个元素的复制列表初始化braced -init-list ,对于数组(因为 arrays 是聚合类型)导致从单个元素进行聚合初始化,这反过来意味着第一个元素该数组是用0
显式初始化的,而 rest 是隐式值初始化的,这意味着对于int
来说,它们是零初始化的,即也初始化为0
。
(有一些例外情况,即使对于聚合,也不会为单个元素 braced-init-list 执行聚合初始化。特别是如果单个元素是相同类型或从正在初始化的目标类型派生的类型,并且如果单个元素是一个字符串文字,目标是一个字符数组。在这些情况下,变量是从花括号初始化列表的元素初始化的。)
={}
是带有一个空的 braced-init-list的复制列表初始化,它以与 _aggregate 初始化相同的方式结束,只是现在没有数组的元素被显式初始化。 相反,它们都是隐式值初始化的,因此是零初始化的。
{}
是直接列表初始化,带有一个空的braced-init-list 。 对于聚合类型, direct-list-initialization和copy-list-initialization之间没有区别。 它们都以aggregate initialization结束。 (在我上面提到的两个例外情况中的第一个中,两者之间存在差异,因为目标将分别从单个元素直接初始化或复制初始化。)
所以最后这三个都是有效的,它们都将所有int
元素初始化为0
。 更一般地,对于标量类型的 arrays,所有元素在所有三个变体中都将被零初始化。
但是,对于其他类型,这三种类型可能具有不同的行为。 不幸的是,在此处的答案 scope 中,迭代所有相关规则是完全不可能的。 特别是,也可以使用列表初始化来初始化非聚合类型,并且它在某些方面的行为与非列表初始化不同。
在 C++11 之前,没有一般的列表初始化,只有聚合初始化,只有在使用=
的形式中才被允许。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.