Является ли 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
это абсолютно неограниченный шаблон.