gpt4 book ai didi

c++ - 不同类型的初始化是其他类型的导数,还是完全分开的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:42:45 26 4
gpt4 key购买 nike

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

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

复制初始化可以使用复制构造函数,但复制初始化与复制构造函数不同。 (对吗?)这让我想知道以下几点:

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

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

如果不是,那么初始化类型发生的优先级和顺序是什么?

最佳答案

按照您的类别顺序:

  1. 值初始化导致某些类型(包括原始类型,如 int)具有一个,这与默认初始化不同,默认初始化使它们未初始化。可以使类类型具有这种行为,这可能非常有效(如果让那些认为默认构造函数说明了整个故事的人感到困惑)。
  2. 直接与复制初始化的概念实际上与列表初始化正交,后者可以是任何一种类型。 (技术术语直接初始化复制初始化不包括列表初始化的情况。)
  3. 复制初始化通常涉及类类型的复制(或移动)构造函数。然而,实现经常将它优化掉,在 C++17 中,构造函数调用 often doesn't happen even in principle .
  4. 列表初始化只是对聚合进行聚合初始化(C++14 中引入的涉及单元素列表的某些特殊情况除外)。
  5. 聚合初始化和零初始化是效果,而不是语法(尽管该站点给出了 char foo[2]=""; 的特殊情况,因为它不在通常的列表初始化规则中) .
  6. 引用初始化只是“当变量是一个引用而不是列表初始化时发生的事情”。它包括将初始化程序转换为引用可以绑定(bind)到的对象的特殊规则。
  7. 常量初始化是调度,而不是语义:它表示某些变量比其他变量更早被初始化(这在其他变量可能使用它们时很重要)。

关于c++ - 不同类型的初始化是其他类型的导数,还是完全分开的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46269972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com