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