GCC 4.8.1 gefällt das:
%Vor% Sie müssen dem Compiler mitteilen, dass das Objekt, über das Sie den Aufruf ausführen, const
ist.
Sie können Derived
hier in dieser declval
nicht angeben, da Derived
zum Zeitpunkt des Aufrufs ein unvollständiger Typ ist. Darüber hinaus benötigen Sie nicht Derived
als Teil von declval
, da f()
ein Mitglied von Base
ist.
Sie versuchen, Derived
in einem Kontext zu verwenden, in dem es vollständig sein muss, aber es kann noch nicht abgeschlossen sein, da es Teil des Rückgabetyps der Methode ist, der zum Vervollständigen der Definition erforderlich ist. Diese Schleife ist für den Compiler unmöglich zu lösen.
Sie müssen die Basisklasse mit std::declval<const Base>()
verwenden und Ihr Code wird kompiliert.
Werfen Sie declval
aus dem Fenster; Wenn Ihr Typausdruck von Funktionsparametern, Klassenmembern und / oder this
abhängig ist, ist es fast sicher einfacher und übersichtlicher, ihn in einen abschließenden Rückgabetyp zu setzen, in dem Sie sich mit dem Namen darauf beziehen können:
Ich habe einen vom Benutzer bereitgestellten Standardkonstruktor zu Derived
hinzugefügt, sodass const Derived x;
gemäß §8.5 / 6 wohlgeformt ist.