В соответствии с cppreference не объединяемые типы классов без каких-либо предоставленных пользователем конструкторов будут инициализироваться нулями перед созданием:
Если T является типом класса без объединения без каких-либо предоставленных пользователем конструкторов, то объект инициализируется нулями, а затем вызывается неявно объявленный конструктор по умолчанию (если это не тривиально)
Я не уверен, что должно произойти, когда используются унаследованные конструкторы c ++ 11, так как в кавычке явно упоминается неявно объявленный конструктор по умолчанию.
Учитывая следующий пример:
#include <iostream>
struct A {
int a;
A() {}
A(int i): a(i) {}
};
struct B: public A {
using A::A;
};
int main() {
B b { 5 };
B* p = new (&b) B{ };
std::cout << b.a << std::endl;
}
Каков правильный вывод, 0 или 5? Должен ли тип класса, исключительно предоставляющий унаследованные конструкторы, инициализироваться нулями до инициализации значения (B{ }
)?
Правильный ответ 0
потому что конструктор по умолчанию для B
неявно объявлено.
Обратите внимание, что по умолчанию, копия & конструкторы перемещения не наследуются; цитата из §12.9 / 3 [class.inhctor]
Для каждого не шаблонного конструктора в наборе кандидатов унаследованных конструкторов кроме конструктора
без параметров или конструктор копирования / перемещения с одним параметром, конструктор неявно
объявляется с теми же характеристиками конструктора, если не существует объявленного пользователем конструктора с такими же
подпись в полном классе, где появляется объявление using или конструктор будет по умолчанию,
скопируйте или переместите конструктор для этого класса.
Ваш пример похож на тот, что указан в N3797, §12.9 / 6 (отредактировано для краткости)
struct B2 {
B2(int = 13, int = 42);
};
struct D2 : B2 {
using B2::B2;
};
Набор кандидатов унаследованных конструкторов в
D2
заB2
является
—B2(const B2&)
—B2(B2&&)
—B2(int = 13, int = 42)
—B2(int = 13)
—B2()
Набор конструкторов присутствует в
D2
является
—D2()
, неявно объявленный конструктор по умолчанию, не наследуется
—D2(const D2&)
, неявно объявленный конструктор копии, не наследуется
—D2(D2&&)
, неявно объявленный конструктор перемещения, не наследуется
—D2(int, int)
, неявно объявленный наследующий конструктор
—D2(int)
, неявно объявленный наследующий конструктор
В вашем случае набор кандидатов унаследованных конструкторов в B
за A
являются
A()
A(int)
A(const& A)
A(A&&)
и конструкторы, присутствующие в B
являются
B() implicitly declared, not inherited
B(int) implicitly declared, inherited
B(const& B) implicitly declared, not inherited
B(B&&) implicitly declared, not inherited
Других решений пока нет …