2014-03-19 4 views
54

fand ich einen solchen Code:Pfeil Operator (->) in Funktion Überschrift

template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) { 
    return a+b; 
} 

ich mit allen Details gedacht, die mir neu waren, aber ein. Sagen Sie mir bitte, wo kann ich lesen, was bedeutet der Pfeil-Operator (->) in Funktionsüberschrift? Ich denke rein logisch, dass -> Operator einen Typ bestimmt, der von auto bekommen wird, aber ich will es gerade, aber kann keine Informationen finden.

+2

Es ist Teil der Syntax des abschließenden Rückgabetyps. Siehe http://stackoverflow.com/a/4113390/962089 – chris

+1

Es ist kein Operator, sondern ein Teil der Syntax. – texasbruce

+0

Als Antwort auf "wo kann ich lesen?" Ist die C++ - Spezifikation am zuverlässigsten. Mangels Geldmitteln oder dem Wunsch, Geld auszugeben, ist der letzte Arbeitsentwurf oft nah genug und kostenlos. Diese Spezifikationen sind hochgradig technisierbar, daher mangelt es Ihnen an Vertrautheit mit dem Lesen von ISO-Spezifikationen, versuchen Sie cplusplus.com oder cppreference.com oder andere solche Seiten, die nicht autorisierend sind, aber in der Regel sehr genau sind. Hinweis: Der abschließende Rückgabetyp kann ab C++ 14 weggelassen werden. – Les

Antwort

86

in C++ 11 gibt es zwei Syntaxen für Funktionsdeklaration:

        RückgabetypIdentifikator(Argument-Erklärungen ...)

und

        autoKennung(Argument-Erklärungen ...)-> return_type

Sie sind gleichwertig. Wenn sie nun gleichwertig sind, warum willst du dann das Letztere benutzen? Nun, C++ 11 führte diese coole decltype Sache ein, mit der Sie den Typ eines Ausdrucks beschreiben können. Vielleicht möchten Sie den Rückgabetyp aus den Argumenttypen ableiten. Also versuchen Sie:

template <typename T1, typename T2> 
decltype(a + b) compose(T1 a, T2 b); 

und der Compiler wird Ihnen sagen, dass es nicht weiß, was a und b sind im decltype Argument. Dies liegt daran, dass sie nur von der Argumentliste deklariert werden.

Sie können das Problem problemlos umgehen, indem Sie declval und die Template-Parameter verwenden, die bereits deklariert sind. Wie:

template <typename T1, typename T2> 
decltype(std::declval<T1>() + std::declval<T2>()) 
compose(T1 a, T2 b); 

außer es wird jetzt wirklich ausführlich. So ist die alternative Erklärung Syntax wurde vorgeschlagen und umgesetzt und jetzt können Sie

template <typename T1, typename T2> 
auto compose(T1 a, T2 b) -> decltype(a + b); 

schreiben und es ist weniger ausführlich und die Scoping-Regeln müssen nicht geändert werden.


C++ 14-Update: C 14 ++ erlaubt auch nur

        autoKennung(Argument-Erklärungen ...)

solange die Funktion vollständig vor der Verwendung definiert ist und alle return-Anweisungen auf den gleichen Typ schließen. Die ->-Syntax bleibt für öffentliche Funktionen (in der Kopfzeile deklariert) hilfreich, wenn Sie den Textkörper in der Quelldatei ausblenden möchten. Etwas offensichtlich ist das nicht mit Templates möglich, aber es gibt einige konkrete Typen (die normalerweise über Template-Metaprogrammierung abgeleitet werden), die sonst schwer zu beschreiben sind.

+0

sehr gut, ordentlich und informativ antworten @ Jan Hudec. Daumen hoch. Ist etwas in 'C++ 14' geändert, da ich' auto' für 'return' in einer solchen Funktion benutze, ohne den' -> decltype (a + b) 'Teil zu benötigen. Ist es jetzt überflüssig oder gibt es andere Fälle, in denen es noch verwendet werden sollte? oder ist es eine Compiler-spezifische Erweiterung? – Shadi

+1

@Shadi, C++ 14 enthält [N3638] (https://isocpp.org/files/papers/N3638.html), was die Ableitung des als 'auto' deklarierten Rückgabetyps ohne die' -> '-Notation erlaubt , solange die Funktion vor der Verwendung vollständig definiert ist und alle return-Anweisungen auf den gleichen Typ zurückführen. Die '->' -Notation ist immer noch nützlich, wenn Sie die Ableitung für die öffentliche Funktion verwenden möchten, während Sie den Körper in der Quelldatei verstecken. –

12

Im einfachen Englisch wird gesagt, dass der Rückgabetyp der abgeleitete Typ der Summe von a und b ist.