【发布时间】:2019-01-03 20:40:54
【问题描述】:
在值初始化上阅读 cppreference,我得出了这个结论:
- 如果 T 是没有默认构造函数或具有 用户提供或删除的默认构造函数,对象为 默认初始化;
还有例子:
struct T3
{
int mem1;
std::string mem2;
T3() { } // user-provided default constructor
};
阅读文章默认initialization
如果 T 是非 POD(C++11 前)类类型,则构造函数为 考虑并受到针对空的重载决议 参数列表。选择的构造函数(这是默认的构造函数之一 构造函数)被调用为新的提供初始值 对象;
如果 T 是数组类型,则数组的每个元素都是 默认初始化;
否则,什么都不做:自动存储的对象 持续时间(及其子对象)被初始化为不确定 价值观。
这适用于示例,T是类类型,这意味着重载决策应该选择候选者来初始化值(用户提供的默认构造函数),但它是空的,所以mem1应该保留不确定的值(这是真的)但同样应该是mem2,但那是“默认初始化”为“”,这是为什么呢?它是否递归工作?类类型的 T 的每个成员都服从第一规则?
我现在很困惑。
2)如果 T 是一个类类型,其默认构造函数既不是 用户提供或删除(也就是说,它可能是一个类 隐式定义或默认的默认构造函数),对象是 零初始化,然后默认初始化,如果它有 非平凡的默认构造函数;
还有例子:
struct T1
{
int mem1;
std::string mem2;
}; // implicit default constructor
mem1 被零初始化为 0,但是“非平凡”的默认构造函数是什么意思? mem2 也默认初始化为“”,但是我仍然不确定,“非平凡的默认构造函数”是什么意思?默认构造函数应该由编译器生成,但是它如何决定什么是非平凡的——如果非平凡的默认构造函数意味着它必须初始化对象——与上面相同的问题,是否意味着每个对象都使用默认构造函数初始化?
【问题讨论】:
-
记住:
T3() { }与T3() = default;不相同,或者根本不写ctor(is与@987654331 相同@)。 -
参见en.cppreference.com/w/cpp/language/default_constructor - “平凡的默认构造函数”部分。