Konflikt im Rückgabetyp von der Basisklasse mit abgeleiteter Klasse unter Verwendung von auto

8

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.

    
Nim 09.06.2016, 12:36
quelle

1 Antwort

14

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.

    
Barry 09.06.2016, 12:58
quelle

Tags und Links