我使用的是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; }
除了返回类型演绎之外,以上声明是否等价?
llmtgqce1#
Using the same GCC (6.3) with the -Wpedantic flag将生成以下警告:
-Wpedantic
warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic] auto foo(auto x) ^~~~
即使没有-Wpedantic,While compiling this in newer versions of GCC也会生成此警告,提醒您有关-fconcepts标志的信息:
-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; }
请看这里:“如果任何函数参数使用占位符(auto或约束类型),则函数声明将改为***缩写的函数模板声明***:[...](概念TS)”----强调我。
auto
1条答案
按热度按时间llmtgqce1#
Using the same GCC (6.3) with the
-Wpedantic
flag将生成以下警告:即使没有
-Wpedantic
,While compiling this in newer versions of GCC也会生成此警告,提醒您有关-fconcepts
标志的信息:实际上,concepts会产生这样的结果:
相当于:
请看这里:“如果任何函数参数使用占位符(
auto
或约束类型),则函数声明将改为***缩写的函数模板声明***:[...](概念TS)”----强调我。