Ich bin auf folgenden Code gestoßen:
template <typename T, typename T1> auto compose(T a, T1 b) -> decltype(a + b) {
return a+b;
}
Eines kann ich nicht verstehen:
Wo kann ich herausfinden, was der Pfeiloperator ( ->
) in der Funktionsüberschrift bedeutet? Ich denke rein logisch, dass der ->
Operator einen Typ bestimmt, auto
auf den abgeleitet wird, aber ich möchte dies klarstellen. Ich kann keine Informationen finden.
Antworten:
In C ++ 11 gibt es zwei Syntaxen für die Funktionsdeklaration:
Rückgabetyp Bezeichner
(
Argumentdeklarationen ...)
und
auto
Bezeichner(
Argument-Deklarationen ...)
->
return_typeSie sind gleichwertig. Nun, wenn sie gleichwertig sind, warum möchten Sie diese jemals verwenden? Nun, C ++ 11 hat diese coole
decltype
Sache eingeführt, mit der Sie die Art eines Ausdrucks beschreiben können. Daher möchten Sie möglicherweise den Rückgabetyp aus den Argumenttypen ableiten. Also versuchst du:und der Compiler wird Ihnen sagen, dass er nicht weiß was
a
undb
in der istdecltype
Argument sind. Das liegt daran, dass sie nur von der Argumentliste deklariert werden.Sie können das Problem leicht
declval
umgehen, indem Sie die bereits deklarierten Vorlagenparameter verwenden. Mögen:außer dass es jetzt sehr ausführlich wird. Daher wurde die alternative Deklarationssyntax vorgeschlagen und implementiert, und jetzt können Sie schreiben
und es ist weniger ausführlich und die Scoping-Regeln mussten nicht geändert werden.
C ++ 14 Update: C ++ 14 erlaubt auch nur
auto
Bezeichner(
Argument-Deklarationen ...)
Solange die Funktion vor der Verwendung vollständig definiert ist und alle
return
Anweisungen denselben Typ haben. Die->
Syntax bleibt für öffentliche Funktionen (im Header deklariert) nützlich, wenn Sie den Text in der Quelldatei ausblenden möchten. Etwas offensichtlich ist dies mit Vorlagen nicht möglich, aber es gibt einige konkrete Typen (die normalerweise über die Metaprogrammierung von Vorlagen abgeleitet werden), die ansonsten schwer zu schreiben sind.quelle
C++14
als ichauto
fürreturn
Typ in einer solchen Funktion , ohne die Notwendigkeit für den-> decltype(a + b)
Teil. Ist es inzwischen überflüssig oder gibt es andere Fälle, in denen es noch verwendet werden sollte? oder ist es eine compilerspezifische Erweiterung?auto
ohne->
Notation deklarierten Rückgabetyps ermöglicht , solange die Funktion vor der Verwendung vollständig definiert ist und allereturn
Anweisungen auf denselben Typ abgeleitet werden. Die->
Notation ist weiterhin nützlich, wenn Sie den Abzug für öffentliche Funktionen verwenden möchten, während Sie den Text in der Quelldatei ausblenden.Im Klartext heißt es, dass der Rückgabetyp der abgeleitete Typ der Summe von
a
und istb
.quelle