【发布时间】:2020-12-08 04:39:41
【问题描述】:
对
T类型的对象进行值初始化意味着:...
— 如果
T是一个(可能是 cv 限定的)类类型,没有用户提供或删除的默认构造函数,则该对象为零初始化并检查默认初始化的语义约束,如果 @987654323 @ 有一个重要的默认构造函数,对象是默认初始化的;
我理解这里的意图:如果用户没有为T 声明默认构造函数,或者在其第一个声明中明确默认了它,那么值初始化的零初始化传递将确保某些直接成员对象的值(例如基本类型的对象)不会留下不确定的值。
我不明白为什么第二遍被指定为“检查默认初始化的语义约束,如果T 有一个非平凡的默认构造函数,则该对象是默认初始化的”。对我来说,这与只是说“对象是默认初始化的”相同(无论默认构造函数是否微不足道)。如果构造函数实际上是微不足道的,调用它应该与不调用它相同。标准不需要告诉编译器不要生成调用,因为这种优化在 as-if 规则下是允许的,任何好的编译器都会这样做。
我错过了什么吗?在值初始化上下文中,调用一个普通的默认构造函数与不调用它有什么不同吗?
【问题讨论】:
-
可能是为了避免您引用的“对象是零初始化的”和“否则,不执行初始化”之间的混淆。默认初始化的一部分。
标签: c++ language-lawyer