In C ++ 11 gibt es zwei Syntaxen für die Funktionsdeklaration:
Rückgabetyp Bezeichner (
Argumentdeklarationen ... )
und
auto
Bezeichner (
Argument-Deklarationen ... )
->
return_type
Sie 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:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
und der Compiler wird Ihnen sagen, dass er nicht weiß was a
und b
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:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
außer dass es jetzt sehr ausführlich wird. Daher wurde die alternative Deklarationssyntax vorgeschlagen und implementiert, und jetzt können Sie schreiben
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
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.