我正在使用GCC 6.3,令我惊讶的是,以下代码片段确实编译了。
auto foo(auto x)
{
return 2.0*x;
}
....
foo(5);
AFAIK是GCC扩展名。比较以下内容:
template <typename T, typename R>
R foo(T x)
{
return 2.0*x;
}
除了返回类型的推导之外,上述声明是否等效?
答案 0 :(得分:3)
Using the same GCC (6.3) with the -Wpedantic
flag将生成以下警告:
warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]
auto foo(auto x)
^~~~
While compiling this in newer versions of GCC,即使没有-Wpedantic
,也会产生此警告,提醒您有关-fconcepts
标志:
warning: use of 'auto' in parameter declaration only available with -fconcepts
auto foo(auto x)
^~~~
Compiler returned: 0
事实上,concepts做到了:
void foo(auto x)
{
auto y = 2.0*x;
}
等效于此:
template<class T>
void foo(T x)
{
auto y = 2.0*x;
}
See here:“如果任何函数参数使用占位符(auto
或约束类型),则函数声明将改为 缩写函数模板声明 :[...](概念TS)” –重点是我。