Ответ 1
Да, это расширение. Я полагаю, он, вероятно, будет добавлен в С++ 17 в рамках предложения "концепции".
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'
.
Да, это расширение. Я полагаю, он, вероятно, будет добавлен в С++ 17 в рамках предложения "концепции".
Это понятия, которые 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
является полностью неограниченным шаблоном.