Тестовете показват странно поведение (c++14
, g++ 4.9.1
, clang 3.5.5
):
Накратко:
- ако
B
не предоставя други конструктори, може да използваA::A()
- ако
B
предоставя други конструктори, той не може да използваA::A()
, но използваA::A(whatever arguments)
, което е неочаквано поведение (поне за мен).
Настройка 1:
struct A {
A() {};
A(int) {}; // with or without this overload the result are the same
};
struct B : A {
using A::A;
};
B b0{}; // OK
Настройка 2:
struct A {
A() {}; // with a default constructor instead (empty class A)
// the results are the same
};
struct B : A {
using A::A;
B(int){}
};
B b0{}; // no matching constructor
B b1{24}; // OK
Настройка 3:
struct A {
A() {};
A(int) {};
};
struct B : A {
using A::A;
B(int, int){}
};
B b0{}; // no matching constructor
B b1{24}; // OK
B b2{24, 42}; // OK
Защо се случва това и как може да се "поправи".
B() = default;
Предполагам, че някои свойства на конструктора по подразбиране не могат да бъдат възпроизведени от наследяващ конструктор, като тривиалност, оттук и специалните правила. - person dyp   schedule 24.02.2015