自动作为常规函数中的参数GCC 4.9扩展?

gcc 4.9允许下面的代码,但是gcc 4.8和clang 3.5.0拒绝它。

void foo(auto c) { std::cout << c.c_str(); } 

我得到warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic]在4.9中,但在4.8和clang我得到error: parameter declared 'auto'

是的,这是一个扩展。 我相信这很可能会作为“概念”提案的一部分添加到C ++ 17中。

这是Concepts Lite所说的

 template<class T> void foo(T c) { std::cout << c.c_str(); } 

auto取代更详细的template<class T> 。 同样,你可以写

 void foo(Sortable c) 

作为速记

 template<class T> requires Sortable<T>{} void foo(T c) 

在这里, Sortable是一个概念,它作为constexpr谓词的一个连接来实现,这个谓词forms化了模板参数的需求。 在名称查找期间检查这些要求。

从这个意义上说, auto是一个完全不受约束的模板。