Конструктор с пустым списком mem-initializer-list и пустым телом

Где можно найти в Стандарте (C ++ 14) предложение о том, что определяемый пользователем конструктор по умолчанию с пустым мем-инициализатора-лист и пустое тело вызывает конструктор по умолчанию для каждого базового класса и для каждого дочернего подобъекта. Например, рассмотрите код ниже:

#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 и пустым телом.

2

Решение

Цитирование из проекта стандарта N4527 12.6.2 / 9 Инициализация баз и членов [class.base.init] (Акцент на шахте):

В не делегирующем конструкторе, если данное потенциально построено
подобъект не обозначен мем-инициализатор-идентификатор (включая дело
где нет мем-инициализатора-лист потому что конструктор не имеет
т е р-инициализатор), затем

(9.1) — если объект является нестатическим членом данных, который имеет
скобки или равно-инициализатор и либо

(9.1.1) — класс конструктора является объединением (9.5), и никакой другой
вариант член этого союза обозначается мем-инициализатор-идентификатор или же

(9.1.2) — класс конструктора не является объединением, и, если объект
не является членом анонимного союза, другой член этого союза не является
обозначенный мем-инициализатор-идентификатор, сущность инициализируется как
указано в 8.5;

(9.2) — в противном случае, если субъект является анонимным объединением или вариантом
член (9.5), инициализация не выполняется;

(9.3) — иначе, объект инициализируется по умолчанию (8.5).

Замечания: Как @ Говард Хиннант Как указано в комментариях ниже, в «окончательном» стандарте C ++ 14 (N4141) приведенная выше цитата содержится в пункте 8, а не в пункте 9

4

Другие решения

Q: Какую именно версию стандарта 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). Неявно объявленный дефолт
Конструктор является встроенным публичным членом своего класса.

1