c++ - ¿Auto como parámetro en una función regular es una extensión GCC 4.9?
c++14 gcc4.9 (2)
gcc 4.9 permite el siguiente código, pero gcc 4.8 y clang 3.5.0 lo rechazan.
void foo(auto c)
{
std::cout << c.c_str();
}
Recibo una
warning: ISO C++ forbids use of ''auto'' in parameter declaration [-Wpedantic]
en 4.9 pero en 4.8 y clang recibo un
error: parameter declared ''auto''
.
Esto es Concepts Lite habla por
template<class T>
void foo(T c)
{
std::cout << c.c_str();
}
El
auto
simplemente reemplaza la
template<class T>
más detallada
template<class T>
.
Del mismo modo, puedes escribir
void foo(Sortable c)
como una abreviatura de
template<class T>
requires Sortable<T>{}
void foo(T c)
Aquí,
Sortable
es un concepto, que se implementa como una conjunción de predicados
constexpr
que formalizan los requisitos en el parámetro de plantilla.
La comprobación de estos requisitos se realiza durante la búsqueda de nombres.
En este sentido,
auto
es una plantilla completamente sin restricciones.
Sí, esta es una extensión. Es probable que se agregue a C ++ 17 como parte de la propuesta de "conceptos", creo.