了解C ++中的初始化顺序

时间:2016-03-01 10:55:45

标签: c++

cppreference.com是一个官方页面,可以依赖于那里提供的文档吗?或者我应该只是阅读语言文档,以防我需要100%的确定性?

查看this文章。首先,列出了几种变量初始化方法:

根据上下文,初始值设定项可以调用以下之一:

  • 值初始化
  • 直接初始化
  • 复制初始化
  • 列表初始化
  • 聚合初始化
  • 参考初始化

如果未提供初始值设定项,则 default initialization 的规则适用。

下一部分解释了非局部变量的初始化的两个阶段:静态和动态。 Zero initialization发生在静态阶段。在default initialization发生时,它没有说出一句话。

当你转到default initialization的描述时,有一个例子说:

int n; // static non-class, a two-phase initialization is done:
       // 1) zero initialization initializes n to zero
       // 2) default initialization does nothing, leaving n being zero

基于此,我假设默认初始化在零初始化之后的某个时间发生(零初始化处于静态初始化阶段)。但是,当默认初始化相对于其他初始化时,这是实际有人提到的唯一地方。

cppreference是不完整的,还是信息在那里,我找不到它?

2 个答案:

答案 0 :(得分:3)

cppreference不是“官方”;这是一个维基。任何人都可以编辑它通常被认为具有相当高的质量,但您应该始终将标准和标准作为您的规范,权威的信息来源。

至于初始化,你的解释是正确的:首先进行零初始化,然后无论需要其他类型的初始化(无论是默认初始化还是其他)。

这是我可以看到引用文字的唯一解释,所以我看不出文章的哪一部分是“不完整的”。

答案 1 :(得分:2)

  

cppreference.com是否以任何方式成为官方网页

不,完全没有。

  

人们可以依赖于那里提供的文件吗?

这是我所知道的最好的免费在线C ++文档,它在Stackoverflow上有很好的声誉。

  

或者,如果我需要100%确定,我应该阅读语言文档吗?

C ++ ISO标准是唯一的官方来源,因此只有这样才能给您100%的确定性。标准文件不是免费的,而是drafts are free并且比如99.99%确定性。

当然," 100%确定"无论如何可能会产生误导。标准是由人类编写的,并且永远不会出现错误或矛盾,尤其是在处理像C ++这样复杂的语言时。如果是,则不会有任何official issues。甚至还有一个相对较新的official defect report for zero-initialisation

您还必须记住," C ++ ISO标准" 可能意味着"已发布的C ++ ISO标准之一远" (1998年,2003年,2011年,2014年),"当前的C ++ ISO标准" (2014)或者甚至是即将到来的(2017年)。

所以也许上面的句子应该改为: A C ++ ISO标准是唯一的官方来源。

  

但这是实际有人提到的唯一地方   默认init相对于其他初始化发生。

那不是真的。例如,http://en.cppreference.com/w/cpp/language/zero_initialization说:

  

如非本地初始化中所述,静态和线程本地   不进行常量初始化的变量(自C ++ 14起)   在进行任何其他初始化之前,零初始化。

整个网站可能还有其他类似的解释。但即使你引用的部分是明确提到它的唯一地方,为什么这会使解释不完整呢?