Существуют ли какие-либо опасности при инициализации родительского класса пустой конструктора в списке инициализации ребенка?
Пример:
class Parent
{
public:
Parent(){}
~Parent(){}
};
class Child : public Parent
{
public:
Child(): Parent()
{}
~Child(){}
};
Причина для вопроса: я часто вижу код, в котором класс родительского класса с пустым ctor не инициализируется в списке инициализации дочернего ctor.
Предположим, что у Parent
нет конструктора, предоставляемого пользователем, например, если он является агрегатом:
struct Parent
{
int x;
int get_value() const { return x; }
};
Теперь существует разница (cf. [dcl.init]/(8.1)), поскольку инициализация инициализации Parent
будет нулевой инициализацией элемента x
, тогда как инициализация по умолчанию не будет:
struct GoodChild : Parent { GoodChild() : Parent() {} };
struct BadChild : Parent { BadChild() {} };
Следовательно:
int n = GoodChild().get_value(); // OK, n == 0
int m = BadChild().get_value(); // Undefined behaviour
[C++11: 12.6.2/8]
), а инициализация по умолчанию агрегата не делает ничего полезного. Напротив, включение Parent()
в инициализатор ctor приведет к инициализации значений его членов ( [C++11: 12.6.2/7]
).