Erben des Basisklassenkonstruktors der zweiten Ebene: Silent error

8

Ich bin heute auf einen sehr unangenehmen Fehler gestoßen, hier ist ein MWE:

%Vor%

Entgegen meinen Erwartungen wird " Default " gedruckt. Zugegeben, der Code ist fehlerhaft, weil die geerbten Konstruktoren von Z versuchen, X zu initialisieren, ohne zu spezifizieren, wie Y (*) . Aber sollte sich der Compiler nicht beschweren? Was ist der Grund dafür, dass der Standardkonstruktor von Y (und anschließend X ) aufgerufen wird, während ich meinen Parameter 3 völlig ignoriere? Ist dies irgendwo im Standard dokumentiert? Oder ist es ein Fehler in meinem Compiler?

Meine Umgebung ist gcc version 6.2.1 20160916 (Red Hat 6.2.1-2) . Auch mit -Weffc++ -Wall -Wextra -pedantic wird keine Compiler-Warnung erzeugt.

    
The Vee 26.09.2016, 12:14
quelle

1 Antwort

2

Es ist ein g ++ Bug, der Code ist ungültig. Nur Konstruktoren von direkten Basen können vererbt werden:

  

[namespace.udecl] §3 Wenn eine using-Deklaration einen Konstruktor benennt, muss der Name-Name-Spezifizierer den Namen a haben direkte Basisklasse der zu definierenden Klasse

    
n.m. 26.09.2016, 12:32
quelle

Tags und Links