2015-09-03 6 views
6

Ich beobachte das Gespräch Modern Template Metaprogramming von Walter E. Brown. Bei 54:40 wird ein Code gegeben, wie untengeben Sie einen Wert ohne Deklaration des Rückgabetyps in der Vorlage zurück, ist das ein Tippfehler?

template<class T, T v> 
struct integral_constant{ 
    static constexpr T value = v; 
    constexpr operator T() const noexcept { return value; } // what does this mean? 
    constexpr T operator T() const noexcept { return value; } 
}; 

ist meine Frage, was ist diese Linie bedeutet constexpr operator T() const noexcept { return value; }, warum gibt es keinen Rückgabetyp, aber es ist immer noch die Rückkehr value? Ist das ein Tippfehler?

+3

Es ist eine Konvertierungsfunktion. http://en.cppreference.com/w/cpp/language/cast_operator – 0x499602D2

+1

Die zweite Zeile ist eigentlich 'constexpr T operator()() const noexcept {Rückgabewert; } ', was ein Funktionsaufruf-Operator ist. –

+0

Ja, Sie haben Recht. Ich habe die Rutsche übersehen. – Allanqunzi

Antwort

9

Ja, die zweite Operatorzeile ist falsch und kann komplett gelöscht werden.

Ein Typ Operator wie zB. operator int() ausgeführt
, wenn das Objekt gegossen wird oder implizit in den Typ umgewandelt:

MyClass myObject; 
int i = myObject; // here operator int() is used. 

Natürlich operator int() hat int zurückzukehren. Es ist nicht notwendig oder erlaubt, einen spezifischen Rückgabetyp für solche Operatoren zu schreiben. In Ihrem Fall ist es nicht int von float oder irgendetwas bestimmtes, aber der Schablonentyp, aber es ist die gleiche Idee.

Neben dem Rückgabetyp-Problem definiert die zweite Operatorzeile denselben Operator mit denselben Parametern erneut, es kann nicht mehrere Funktionen mit demselben Namen und denselben Parametern geben.

Und nach dem ganzen struct fehlt ein Semikolon.

Nachdem Sie diese Probleme zu beheben, es kompiliert: http://ideone.com/Hvrex5

+0

Entschuldigung, das Semikolon für 'struct' ist behoben. – Allanqunzi

+0

Die zweite Zeile in der Diskussion ist korrekt. Das OP hat es falsch geschrieben. Und es wird eine "Konvertierungsfunktion" genannt, kein "Typoperator". –

+0

Ich habe es jetzt gesehen, ja. OP: Mit der richtigen Zeile können Sie beide Operatoren behalten, der erste ist der Typ op wie hier erklärt und der zweite ist ein normaler Op mit Rückgabetyp wie üblich. – deviantfan

3

Der erste ist kein Tippfehler. Diese Syntax wird verwendet, um die Konvertierung von einem Objekt der Klasse in einen anderen Typ zu ermöglichen.

Der Rückgabetyp ist T

Siehe http://en.cppreference.com/w/cpp/language/cast_operator für weitere Informationen.

Das Qualifikationsmerkmal consexpr zeigt dem Compiler an, dass der Rückgabewert der Elementfunktion zur Kompilierzeit bestimmt werden kann, wenn das Objekt, für das es aufgerufen wird, ebenfalls constexpr qualifiziert ist.

Die zweite ist keine rechtliche Aussage.