The following:
auto (*f())() -> int;
gives an error in C++11 mode with Clang saying:
error: 'auto' return without trailing return type; deduced return types are a C++14 extension
but compiles in C++14 mode. GCC compiles without complaining in both modes with -Wall -Wextra -pedantic.
n3337 7.1.6.4/2 says:
The auto type-specifier may appear with a function declarator with a trailing-return-type (8.3.5) in any context where such a declarator is valid.
8.3.5p2 talks about function declarators but I'm too inexperienced to figure it out. Can anyone explain if it's legal in C++11?
The trailing return type feature removes a C++ limitation where the return type of a function template cannot be generalized if the return type depends on the types of the function arguments.
In C++14, you can just use auto as a return type.
In computer programming, the return type (or result type) defines and constrains the data type of the value returned from a subroutine or method. In many programming languages (especially statically-typed programming languages such as C, C++, Java) the return type must be explicitly specified when declaring a function.
Use auto and decltype to declare a function template whose return type depends on the types of its template arguments. Or, use auto and decltype to declare a function template that wraps a call to another function, and then returns the return type of the wrapped function.
This is partly covered by CWG 1725:
The treatment of a declaration like the following is not clear:
auto (*f())() -> int; // #18.3.5 [dcl.fct] paragraph 2 appears to require determining the type of the nested declarator
auto (*f()); // #2which, because it does not have a trailing-return-type, would be ill-formed by (C++11) 7.1.6.4 [dcl.spec.auto]. (In C++14, an auto return type without a trailing-return-type is, of course, permitted.)
Rationale (September, 2013): The intent of the C++11 wording is that the requirement for a trailing return type applies only at the top level of the declarator to which auto applies, not to each possible recursive stage in the declarator processing. [..]
Furthermore, according to [dcl.fct]/2,
In a declaration
T DwhereDhas the form
D1(parameter-declaration-clause)[...] trailing-return-typeand the type of the contained declarator-id in the declaration
T D1is “derived-declarator-type-listT”,Tshall be the single type-specifierauto.
As mentioned in the DR, T D1 is auto (*f()), which is of type "function of () returning pointer to auto" (i.e. matches the requirement). Hence your code is valid in both C++11 and 14, and f's type is "function of () returning pointer to function of () returning int".
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With