Ich habe den folgenden Code:
%Vor% Dies kann nicht kompiliert werden (getestet auf coliru - mit gcc) mit einem widersprüchlichen Rückgabetyp - meine Frage ist, warum kann der Compiler nicht ableiten, dass sowohl internal_
(und daher der Rückgabetyp) A
ist? Wird der Typ für auto
beispielsweise in einer anderen Kompilierungsstufe abgeleitet als derjenige, der die virtuellen Überschreibungen überprüft? Natürlich kompiliert das, wenn Sie auto
durch den korrekten Typ ersetzen - aber das ist neben dem Punkt.
(Hier ist der clang Fehler, gcc ist etwas ähnlich)
main.cpp: 8: 11: Fehler: Rückgabetyp der virtuellen Funktion 'intern' ist nicht kovariant mit dem Rückgabetyp der Funktion, die es überschreibt ('auto &Ampere;' stammt nicht von "A & amp;")
%Vor%main.cpp: 4: 16: Hinweis: Überschriebene virtuelle Funktion ist hier
%Vor%1 Fehler generiert.
Von [dcl.spec.auto] :
Eine Funktion, die mit einem Rückgabetyp deklariert ist, der einen Platzhaltertyp verwendet, darf nicht virtuell sein ([class.virtual]).
internal()
ist eine virtuelle Funktion, daher können Sie auto
nicht verwenden.
Der ursprüngliche Vorschlag gibt die Gründe dafür an:
Es wäre möglich, eine Rückgabetypabrechnung für virtuelle Funktionen zuzulassen, aber das würde sowohl die Überprüfung der Überschreibung als auch das Layout von vtable erschweren, daher scheint es vorzuziehen, dies zu verbieten.