值初始化c++

Value initialization c++

本文关键字:c++ 初始化      更新时间:2023-10-16

读取值初始化时的cppreference,我得出了以下结论:

  1. 如果T是一个没有默认构造函数或具有用户提供或删除的默认构造函数,对象为默认初始化

示例:

struct T3
{
int mem1;
std::string mem2;
T3() { } // user-provided default constructor
};

正在阅读关于默认初始化的文章

如果T是非POD(直到C++11)类类型,则构造函数为考虑并根据空载情况进行过载解决参数列表。所选的构造函数(它是默认的构造函数之一构造函数)来为新的对象

如果T是数组类型,则该数组的每个元素都是默认初始化;

否则,什么都不做:具有自动存储的对象持续时间(及其子对象)初始化为不确定价值观

这适用于示例,T是类类型,这意味着重载解析应该选择用于初始化值的候选者(用户提供的默认构造函数),但它是空的,因此mem1应该保留未确定的值(这是真的),但mem2应该相同,但这是";默认初始化";至"&";,为什么?它能递归工作吗?类类型T的每个成员都服从第一条规则?

我现在很困惑。


2)如果T是一个具有默认构造函数的类类型用户提供或删除(也就是说,它可能是一个具有隐式定义或默认构造函数),对象为0初始化,如果它有非平凡默认构造函数;

示例:

struct T1
{
int mem1;
std::string mem2;
}; // implicit default constructor

mem1被零初始化为0;非琐碎的";违约建设者的手段?CCD_ 4也默认初始化为"0"&";,尽管我仍然不确定;非平凡默认构造函数";方法默认构造函数应该由编译器生成,但是它如何决定什么是非平凡的——如果非平凡的默认构造函数意味着它必须初始化对象——和上面的问题一样,它是否意味着每个对象都用默认构造函数初始化?

应该是mem2,但那是"默认初始化"为",为什么?它能递归工作吗?类类型T的每个成员都服从第一条规则?

你的怀疑是正确的。默认初始化类时,由于构造函数中未指定初始化,因此默认初始化其每个成员。由于std::string有一个用户提供的默认构造函数被调用,并且它将字符串对象初始化为零。

然而,"非平凡"的默认构造函数意味着什么?

一个琐碎的构造函数就是一个无所事事的构造函数。对于类型T,如果

  • 构造函数不是用户提供的(即,隐式定义或默认)
  • T没有虚拟成员功能
  • T没有虚拟基类
  • T没有带大括号或相等初始值设定项的非静态成员
  • T的每个直接基都有一个平凡的默认构造函数
  • 类类型的每个非静态成员都有一个琐碎的默认构造函数

因此,在T1的情况下,您没有琐碎的构造函数,因为std::string的默认构造函数是非琐碎的。

这适用于examle,T是类类型,这意味着重载解析应该选择要初始化值的候选者(用户提供的默认构造函数),但它是空的,所以mem1应该保留未定义的值(这是真的),但mem2应该是一样的,但这是"默认初始化"为",为什么?

如果从成员初始值设定项列表中省略了一个数据成员,则它是默认初始化的,这对std::string来说意味着调用它的默认构造函数并将其初始化为空字符串。默认构造函数没有成员初始值设定项列表,因此所有成员都将默认初始化。

"非平凡"默认构造函数意味着什么?

您可以在这里找到对琐碎构造函数的要求。非平凡的默认构造函数只是一个默认构造函数,它不尊重平凡构造函数的所有要求。简而言之,一个琐碎的默认构造函数除了标记对象生命周期的开始之外,根本不做任何事情(即使是在后台)。

这是否意味着每个对象都用默认构造函数初始化?

如前所述,默认构造函数(与任何其他构造函数一样)将默认初始化成员初始值设定项列表中未指定的任何数据成员。由于默认情况下为空,默认构造函数将递归地导致默认初始化,除非内部成员使用成员初始值设定项列表指定替代初始化。