Is auto as a parameter in a regular function a GCC

2019-01-03 18:26发布

gcc 4.9 allows the following code, but gcc 4.8 and clang 3.5.0 reject it.

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

I get warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic] in 4.9 but in 4.8 and clang I get error: parameter declared 'auto'.

2条回答
倾城 Initia
2楼-- · 2019-01-03 19:07

Yes, this is an extension. It's likely to be added to C++17 as part of the 'concepts' proposal, I believe.

查看更多
Juvenile、少年°
3楼-- · 2019-01-03 19:23

This is Concepts Lite speak for

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

The auto just replaces the more verbose template<class T>. Similarly, you can write

void foo(Sortable c)

as a shorthand for

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

Here, Sortable is a concept, which is implemented as a conjunction of constexpr predicates that formalize the requirements on the template parameter. Checking these requirements is done during name lookup.

In this sense, auto is a completely unconstrained template.

查看更多
登录 后发表回答