Top Qs
Timeline
Chat
Perspective
Trailing return type
From Wikipedia, the free encyclopedia
Remove ads
In computer programming, a subroutine (a.k.a. function) 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.[1] 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.[2][3][4]
Remove ads
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 {
private:
vector<int> items;
public:
bool hasMultipleItems() {
return items.size() > 1;
}
};
A trailing return type is specified after the parameter list, following ->
symbols:
using std::vector;
class MyClass {
private:
vector<int> items;
public:
auto hasMultipleItems() -> bool {
return items.size() > 1;
}
};
Remove ads
Distinction from other language features
In modern C++, the meaning of the auto
keyword will depend on its context:
- When used in a variable's definition (e.g.,
auto x = 11;
), theauto
keyword indicates type inference. The data type for thatx
will be deduced from its initialization. The return type of a function can also be inferred by usingauto
without specifying a trailing return type. For example:
auto hasMultipleItems() {
return items.size() > 1;
}
- On the other hand, there is no type inference in the
hasMultipleItems()
example on the previous section. That example only uses theauto
keyword as a syntactic element, because a trailing return type is being used.
Remove ads
Rationale
Consider the task of programming a generic version of the following:
int add(const int& lhs, const int& rhs) {
return lhs + rhs;
}
A proper expression of this function's return type would use the two formal parameter names with decltype: decltype(lhs + rhs)
. 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 <typename L, typename R>
decltype(lhs + rhs) add(const L& lhs, const R& rhs) {
return lhs + rhs;
}
However, where a trailing return type is specified, the formal parameters are in scope:
template <typename L, typename R>
auto add(const L& lhs, const R& rhs) -> decltype(lhs + rhs) {
return lhs + rhs;
}
See also
References
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads