我正在阅读初始化here,它讨论了不同类型的初始化,如所示,其中a
是一个任意变量(每个都有不同的语法):
T
T{}
T(a)
T val = a
T{...}
T{...}
T &ref = a
T{}
static T &ref = a
复制初始化可以使用复制构造函数,但复制初始化与复制构造函数不同。 (对吧?)这让我对以下内容感到疑惑:
某些类型的初始化重叠的语法,例如值初始化和零初始化都使用类似的语法,聚合初始化和列表初始化具有类似的语法等。
问题:这是否意味着某些类型的初始化是来自其他人的衍生物?例如。是在满足特定环境时从值初始化派生的零初始化,并且是集合初始化的列表初始化形式,因为它们都具有相似的语法。
如果没有,那么初始化类型的优先级和排序是什么?
答案 0 :(得分:0)
复制初始化可以使用复制构造函数,但复制初始化与复制构造函数不同。 (右?)
这类似于“函数可以在函数调用中使用,但函数与函数调用不同。(对吗?)”。实际上,它们是分开的,但是相关的概念。
问题:这是否意味着某些类型的初始化是来自其他类型的衍生物?
目前还不清楚“别人的衍生品”是什么意思。当然,在某些值初始化情况下,执行零初始化。但是在所有值初始化中不执行零初始化(例如,当类具有用户定义的构造函数时)。此外,有些情况下执行零初始化,其中值初始化不是(例如,静态存储持续时间的变量在任何其他初始化之前初始化为零(如果有的话)。
您链接的网站具有相当详细的描述,其中描述了执行每个可能的初始化的情况。权威性描述可以在C ++标准文档中找到。
答案 1 :(得分:0)
按类别的顺序:
int
)具有值,这与默认初始化不同,这使得它们保持未初始化状态。可以使类类型具有此行为,这可能非常有效(如果对假定默认构造函数讲述整个故事的人感到困惑)。char foo[2]="";
的特殊情况,因为通常的列表初始化规则没有涵盖它。)