2014-01-13 8 views
18

ich zufällig über den unten Code-Schnipsel in einem Video auf C++ 11, in dem der Autor verwendetWas bedeutet auto main() -> int?

auto main()->int 

ich das nicht verstanden kommen. Ich habe versucht, in g++ unter Verwendung -std=c++11 zu kompilieren und es funktioniert. Kann mir jemand erklären, was hier vor sich geht? Ich habe versucht mit "auto main() -> int" zu suchen, habe aber keine Hilfe gefunden.

Antwort

35

C++ 11 eingeführt, um eine Notation für nachlauf return Typen: Wenn eine Funktionsdeklaration mit auto eingeführt wird, wird der Rückgabetyp nach den Parametern und eine -> Sequenz angegeben werden. Das heißt, es genügt, main() zu deklarieren, um int zurückzugeben.

Die Bedeutung der abschließenden Rückgabetypen ist hauptsächlich für Funktionsschablonen, wo es jetzt möglich ist, Parameter für die Funktion zusammen mit decltype() zu verwenden, um den Rückgabetyp zu bestimmen.Zum Beispiel:

template <typename M, typename N> 
auto multiply(M const& m, N const& n) -> decltype(m * n); 

Dies erklärt die Funktion multiply() die Art von m * n erzeugt zurückzukehren. Die Verwendung von decltype() vor multiply() wäre ungültig, da m und n noch nicht deklariert sind.

Obwohl es hauptsächlich für Funktionsschablonen nützlich ist, kann die gleiche Notation auch für andere Funktionen verwendet werden. Mit C++ 14 kann der Trailing-Rückgabetyp sogar weggelassen werden, wenn die Funktion unter bestimmten Bedingungen mit auto eingeführt wird.

+12

und was ist der Vorteil, Main so zu deklarieren? –

+6

@PaperBirdMaster: Ich behaupte nicht, dass es einen Vorteil gibt. Es ist jedoch erlaubt und nicht schlechter als die Alternative. –

+2

Entschuldigung für das Missverständnis, ich sage nicht, dass Sie sagen, dass es einen Vorteil für den Trailing-Return-Typ (TRT) auf 'main' gibt, ich frage nur (und frage mich), ob es einen Vorteil bei dieser Verwendung des TRT gibt in diesem Zusammenhang ... Ich denke, dass einschließlich dieser Erklärung (falls vorhanden) wäre schön, die Antwort zu verbessern –

7

Es heißt Nachlauf-Typ. Es ist besonders nützlich in generischen Codes, die Vorlagen verwenden, bei denen der Rückgabetyp von dem Ausdruck abhängt, der einige andere Vorlagenargumente enthält. Es wird auch in Lambda verwendet. Hier

ein Beispiel:

template<typename T, typename U> 
auto add(T t, U u) -> decltype(t+u) 
{ 
    return t + u; 
} 

Hier ist der Rückgabetyp auf die Expression abhängt t+u. Was auch immer der Typ des Ausdrucks ist, ist auch der Rückgabetyp der Funktion, der durch decltype(t+u) angezeigt wird.

11

Dies ist eine einheitliche Funktion Deklaration Syntax, Trailing-Rückgabetyp, in C++ 11 eingeführt.

Sie können keine andere Syntax für Lamdas verwenden, und es ist auch sehr praktisch für Funktionsvorlagen, bei denen der Ergebnistyp von Argumenten abhängt.

Wenn Sie eine einzige Syntax auswählen möchten (und ich denke, das ist eine gute Idee), dann haben Sie keine Wahl: Die alte Syntax kann nicht für Lambda-Ausdrücke verwendet werden.

Grund dafür mit:

  • Nun, eine einzelne Syntax.

  • Funktionsname immer an der gleichen Stelle visuell, unterstützt schnelles Scannen von Code.

  • Das Gleiche gilt für den Ergebnistyp, einfache visuelle Erkennung (plus, Sie müssen es nicht in Frage kommen, wenn es sich um eine Art in eine Elementfunktion der Klasse definiert ist).

Gründe gegen umfassen einige zusätzliche Ausführlichkeit, die Verwendung von alten Compiler, die diese Syntax nicht verstehen, dass etwas Neues beängstigend und unangenehm und nur seltsam fühlen kann.

+3

+1. Ich benutze diese Syntax auch im normalen Code genau für diesen Punkt: * Funktionsname immer am selben Ort, visuell, unterstützt schnelles Scannen von Code *. Für uns Menschen ist es einfach, mit wenig Aufwand den Namen der Funktion herauszufinden, denn nach 'auto' wird der Funktionsname geschrieben. Optisch für alle Funktionen gleich. – Nawaz

+7

** Ich persönlich finde 'auto main() -> int 'eine schreckliche Idee. ** *" Nun, eine einzige Syntax. "* Außer diesen Millionen von Zeilen Code, die bereits existieren. Es wird eine gemischte Syntax mit den alten Codes sein, egal was passiert. * "Funktionsname immer an der gleichen Stelle visuell, unterstützt schnelles Scannen von Code." * Ich verwende die von meiner IDE generierte Gliederung, die noch schneller zu scannen ist. * "Dito für den Ergebnistyp, einfache visuelle Erkennung." * Warum ist es einfacher, den Rückgabetyp in 'auto main() -> int' zu finden als in' int main() ', wo der Rückgabetyp ganz vorne ist Muss ich nichts durchlesen um es herauszufinden? – Ali

+3

@Ali: re "Warum ist es einfacher, den Rückgabetyp in auto main() -> int als in int main() zu finden, wo der Rückgabetyp ganz vorne ist, muss ich nichts durchlesen Wenn Sie es für notwendig erachten, ein Strohmann-Argument anzugreifen, geben Sie zu, dass Sie kein wirkliches Argument haben. Gefühle von Horror und Abscheu sind jedoch ein legitimer Grund, etwas nicht zu tun. Egal wie irrational die Gefühle sind, sie beeinflussen die eigenen Handlungen, und man könnte viel weniger produktiv sein, sie bekämpfen zu müssen. –