gcc 将函数参数类型声明为auto

whitzsjs  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(200)

我使用的是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; }

除了返回类型演绎之外,以上声明是否等价?

llmtgqce

llmtgqce1#

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)
          ^~~~

即使没有-WpedanticWhile compiling this in newer versions of GCC也会生成此警告,提醒您有关-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)”----强调我。

相关问题