Trailing return type
In computer programming, a subroutine will often inform calling code about the result of its computation, by returning a value to that calling code.
The data type of that value is called the function's return type.
In the C++ programming language, a function must be declared.
The C++ function's return type is specified as a part of declaring that function.
A trailing return type, a syntax feature available since C++11, is like a traditional return type, except that it is specified in a different location.
Syntax
An ordinary return type is specified before the function's name.In this example of traditional C++ code, the return type of
hasMultipleItems is bool:using std::vector;
class MyClass ;
A trailing return type is specified after the parameter list, following
-> symbols:using std::vector;
class MyClass ;
Distinction from other language features
In modern C++, the meaning of theauto keyword will depend on its context:- When used in a variable's definition, the
autokeyword indicates type inference. The data type for thatxwill be deduced from its initialization. The return type of a function can also be inferred by usingautowithout specifying a trailing return type. For example:
auto hasMultipleItems
- On the other hand, there is no type inference in the
hasMultipleItemsexample on the previous section. That example only uses theautokeyword as a syntactic element, because a trailing return type is being used.
Rationale
Consider the task of programming a generic version of the following:int add
A proper expression of this function's return type would use the two formal parameter names with decltype:
decltype. However, where a return type is traditionally specified, those two formal parameters are not yet in scope.Consequently, this code will not compile:
// This will not compile
template
decltype add
However, where a trailing return type is specified, the formal parameters are in scope:
template
auto add -> decltype