Wie bekomme ich eine const qualifizierte Deklaration?

8

Betrachten Sie den folgenden Code:

%Vor%

Wie ändert man decltype(std::declval<Derived>().f()) so, dass es int und nicht double zurückgibt?

Ich habe versucht decltype(std::declval<const Derived>().f() , aber es kompiliert nicht.

    
Vincent 13.01.2014, 20:48
quelle

3 Antworten

6

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.

    
John Dibling 13.01.2014, 20:58
quelle
5

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.

    
Daniel Frey 13.01.2014 20:52
quelle
0

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:

%Vor%

Ich habe einen vom Benutzer bereitgestellten Standardkonstruktor zu Derived hinzugefügt, sodass const Derived x; gemäß §8.5 / 6 wohlgeformt ist.

    
Casey 13.01.2014 21:05
quelle

Tags und Links