在哪里可以找到标准(C ++ 14)中的一个子句,声明用户定义的默认构造函数具有空的 mem-initializer-list 和一个空体调用默认构造函数每个基类和每个成员子对象。例如,请考虑以下代码:
#include <iostream>
class A{
public:
A() {std::cout << "A" << '\n'; }
};
class Base{
public:
Base() { std::cout << "Base" << '\n'; }
};
class Derived : public Base {
A a;
public:
Derived() {}
};
int main()
{
Derived d;
}
Base
和A
的构造函数由用户声明的构造函数Derived()
调用,其中包含一个空的mem-initializer-list和一个空体。
答案 0 :(得分:4)
引用标准草案N4527 12.6.2 / 9初始化基础和成员[class.base.init] ( Emphasis Mine ):
在非委托构造函数中,如果给定可能构造的 子对象不是由 mem-initializer-id 指定的(包括案例 其中没有 mem-initializer-list ,因为构造函数没有 ctor-initializer ),然后
(9.1) - 如果实体是具有的实体是非静态数据成员 brace-or-equal-initializer 和
(9.1.1) - 构造函数的类是一个union(9.5),而不是其他的 该联合的变体成员由 mem-initializer-id 或
指定(9.1.2) - 构造函数的类不是union,如果是实体 是一个匿名工会的成员,该工会的其他成员都不是 由 mem-initializer-id 指定,实体初始化为 在8.5中指定;
(9.2) - 否则,如果该实体是匿名工会或变体 member(9.5),不执行初始化;
(9.3) - 否则,该实体默认初始化(8.5)。
注意:正如@Howard Hinnant在下面的评论中指出的那样,在C ++ 14(N4141)“最终确定”标准中,上述引用位于第8段而非第9段。 / p>
答案 1 :(得分:1)
来自n4296:
https://isocpp.org/std/the-standard
注意:
在某些情况下,C ++实现隐式定义了 默认构造函数(12.1),复制构造函数(12.8),移动构造函数 (12.8),复制赋值运算符(12.8),移动赋值运算符 (12.8),或析构函数(12.4)成员函数。 - 注意
也;
类X的默认构造函数是类X的构造函数 要么没有参数,要么每个参数都不是函数 参数包有一个默认参数。如果没有用户声明 类X的构造函数,没有参数的构造函数 隐含地宣布为违约(8.4)。隐式声明的默认值 构造函数是其类的内联公共成员。