繁体   English   中英

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

[英]Understanding initialization order in C++

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

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

根据上下文,初始化程序可以调用以下之一:

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

如果未提供初始化程序,则应用默认初始化规则。

下一部分解释了非局部变量的两个初始化阶段:静态和动态。 零初始化发生在静态阶段。 虽然默认初始化发生时没有说出一个字。

当你转到默认初始化的描述时,有一个例子说:

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

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

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

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

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

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

cppreference.com是一个官方页面

一点都不。

一个人可以依赖于那里提供的文件?

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

或者我应该只是阅读语言文档,以防我需要100%的确定性?

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

当然,“100%确定性”可能会产生误导。 标准是由人类编写的,并且永远不会出现错误或矛盾,尤其是在处理像C ++这样复杂的语言时。 如果是,那就不会有任何官方问题 甚至还有一个相对较新的关于零初始化的官方缺陷报告

您还必须记住, “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)在进行任何其他初始化之前都是零初始化的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM