Jak stwierdził [namespace.udecl]/18:dziedziczone konstruktorzy, domyślny konstruktor i widoczność
[...] A z użyciem deklaracja, że nazwy konstruktor nie tworzy synonim; zamiast tego dodatkowe konstruktory są dostępne, jeśli byłyby dostępne, gdy są używane do konstruowania obiektu odpowiedniej klasy bazowej, a dostępność deklaracji użycia jest ignorowana. [...]
Z tego powodu, poniższy kod nie kompilacji:
class B { protected: B(int) { } };
class D: B { using B::B; };
int main() { D d{0}; }
Zwraca błąd, który jest mniej więcej taka sama w przypadku wszystkich głównych kompilatory:
uznanej chroniony tutaj
z drugiej strony, co następuje kod kompiluje:
class B { protected: B() { } };
class D: B { using B::B; };
int main() { D d{}; }
Czy nie powinieneś go skompilować z tych samych powodów, które doprowadziły do błędu w poprzednim przykładzie?
Co to pozwala na kompilację?
Wskazówka: 'D' nie ma konstruktora deklarowanego przez użytkownika. –
@ T.C. Myślałem o tym samym, ale "dostępność deklaracji użycia jest ignorowana", więc czy domyślny konstruktor nie powinien być dziedziczony i chroniony w drugim przypadku? – skypjack
OK, kolejna wskazówka. Co dzieje się w wyrażeniu [class.ctor]/4, jeśli klasa nie ma konstruktora deklarowanego przez użytkownika? I jak to wchodzi w interakcję z konstruktorem klasy podstawowej, biorąc pod uwagę [namespace.udecl]/15? –