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

Где я могу найти в Стандарте (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 и пустым телом.

2 ответа

Решение

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

В не делегирующем конструкторе, если данный потенциально сконструированный подобъект не обозначен с помощью mem-initializer-id (включая случай, когда нет mem-initializer-list, потому что конструктор не имеет ctor-initializer), тогда

(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.

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

Другие вопросы по тегам