Является ли auto в качестве параметра в обычной функции расширением 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 и лязг получаю error: parameter declared 'auto',

2 ответа

Да, это расширение. Я полагаю, что он будет добавлен в 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 предикаты, которые формализуют требования к параметру шаблона. Проверка этих требований выполняется во время поиска имени.

В этом смысле, auto это абсолютно неограниченный шаблон.

Другие вопросы по тегам