是不同类型的其他类型的初始化衍生物,还是它们完全分开?

时间:2017-09-18 00:05:05

标签: c++ c++11

我正在阅读初始化here,它讨论了不同类型的初始化,如所示,其中a是一个任意变量(每个都有不同的语法):

  • 默认初始化T
  • 值初始化T{}
  • 直接初始化T(a)
  • 复制初始化T val = a
  • 列出初始化T{...}
  • 聚合初始化T{...}
  • 参考初始化T &ref = a
  • 零初始化T{}
  • 常量初始化static T &ref = a

复制初始化可以使用复制构造函数,但复制初始化与复制构造函数不同。 (对吧?)这让我对以下内容感到疑惑:

某些类型的初始化重叠的语法,例如值初始化和零初始化都使用类似的语法,聚合初始化和列表初始化具有类似的语法等。

问题:这是否意味着某些类型的初始化是来自其他人的衍生物?例如。是在满足特定环境时从值初始化派生的零初始化,并且是集合初始化的列表初始化形式,因为它们都具有相似的语法。

如果没有,那么初始化类型的优先级和排序是什么?

2 个答案:

答案 0 :(得分:0)

  

复制初始化可以使用复制构造函数,但复制初始化与复制构造函数不同。 (右?)

这类似于“函数可以在函数调用中使用,但函数与函数调用不同。(对吗?)”。实际上,它们是分开的,但是相关的概念。

  

问题:这是否意味着某些类型的初始化是来自其他类型的衍生物?

目前还不清楚“别人的衍生品”是什么意思。当然,在某些值初始化情况下,执行零初始化。但是在所有值初始化中不执行零初始化(例如,当类具有用户定义的构造函数时)。此外,有些情况下执行零初始化,其中值初始化不是(例如,静态存储持续时间的变量在任何其他初始化之前初始化为零(如果有的话)。

您链接的网站具有相当详细的描述,其中描述了执行每个可能的初始化的情况。权威性描述可以在C ++标准文档中找到。

答案 1 :(得分:0)

按类别的顺序:

  1. 值初始化会导致某些类型(包括基本类型,如int)具有,这与默认初始化不同,这使得它们保持未初始化状态。可以使类类型具有此行为,这可能非常有效(如果对假定默认构造函数讲述整个故事的人感到困惑)。
  2. 直接与复制初始化,因为概念实际上与列表初始化正交,列表初始化可以是任一类型。 (技术术语直接初始化复制初始化排除了列表初始化情况。)
  3. 复制初始化通常涉及类类型的复制(或移动)构造函数。但是,实现通常会优化它,并且在C ++ 17中构造函数调用often doesn't happen even in principle
  4. 列表初始化只执行聚合的聚合初始化(除了涉及C ++ 14中引入的单元素列表的某些特殊情况)。
  5. 聚合初始化和零初始化是效果,而不是语法(尽管该网站给出了char foo[2]="";的特殊情况,因为通常的列表初始化规则没有涵盖它。)
  6. 参考初始化只是"当变量是引用并且它不是列表初始化时会发生什么?#34;。它包括将初始化程序转换为引用可以绑定的对象的特殊规则。
  7. 常量初始化是调度,而不是语义:它表示某些变量比其他变量更早初始化(当其他变量使用它们时这很重要。)