Подтвердить что ты не робот

Является ли 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 и clang получаю error: parameter declared 'auto'.

4b9b3361

Ответ 1

Да, это расширение. Я полагаю, он, вероятно, будет добавлен в С++ 17 в рамках предложения "концепции".

Ответ 2

Это понятия, которые 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 является полностью неограниченным шаблоном.