将函数参数类型声明为自动

时间:2018-09-22 05:49:35

标签: c++ gcc auto

我正在使用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;
    }

除了返回类型的推导之外,上述声明是否等效?

1 个答案:

答案 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)” –重点是我。