2

我在哪里可以在标准 (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 和一个空的主体。

4

2 回答 2

4

引用标准草案N4527 12.6.2/9 Initializing bases and members [class.base.init]Emphasis Mine):

在非委托构造函数中,如果给定的潜在构造子对象不是由mem-initializer-id指定的(包括由于构造函数没有 ctor-initializer而没有mem-initializer-list的情况),则

(9.1) — 如果实体是一个非静态数据成员,它有一个 大括号或等号初始化器,并且要么

(9.1.1) — 构造函数的类是联合 (9.5),并且该联合的其他变体成员没有由mem-initializer-id指定或

(9.1.2) — 构造函数的类不是联合,并且,如果实体是匿名联合的成员,则该联合的其他成员没有由mem-initializer-id指定,实体按照8.5;

(9.2) — 否则,如果实体是匿名联合或变体成员 (9.5),则不执行初始化;

(9.3) — 否则,实体被默认初始化(8.5)。

注意:正如@Howard Hinnant在下面的评论中指出的那样,在 C++14(N4141)“最终确定”标准中,上面的引用位于第 8 段而不是第 9 段。

于 2015-10-16T21:21:29.763 回答
1

问:您具体指的是哪个版本的 C++ 14 标准?

从 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)。隐式声明的默认构造函数是其类的内联公共成员。

于 2015-10-16T20:32:37.200 回答