Using Clang 3.5, 3.6, or 3.7, with the flag std=c++1y
the following code does not compile :
#include <iostream>
auto foo(auto bar) { return bar; }
int main() {
std::cout << foo(5.0f) << std::endl;
}
The error given is :
error: 'auto' not allowed in function prototype
I do not have errors using g++ 4.9. Is this error produced because Clang has not yet implemented this functionnality yet or is it because I am not allowed to do that and GCC somehow permits it ?
You can use a template instead:
Auto is only allowed when the Compiler can deduce the type from the context.
As we see from the ISO C++ discussion mailing: decltype(auto) parameters vs. perfect forwarding auto parameters of non-lambdas is part of concepts lite and therefore not in C++14:
If we use the -pedantic flag with
gcc
we receive the following warning:So this looks like an extension.
As dyp pointed out, polymorphic lambdas did make it into C++14 and do allow auto parameters, an example taken from the paper:
Which is incidentally the same functionality you want to implement in your example.
Although your specific syntax did not make it to C++14, a similar option which did is:
which achieves basically the same thing.
The compiler cannot infer the type from the context.
What's wrong with doing
and must you pass
bar
by value?In your case you can use the trailing return type syntax:
auto foo(auto bar) -> decltype(bar)