¿Es automático como parámetro en una función regular una extensión GCC 4.9?

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 obtengo el error: parameter declared 'auto' .

Sí, esta es una extensión. Es probable que se agregue a C ++ 17 como parte de la propuesta de ‘conceptos’, creo.

Esto es Concepts Lite hablar por

 template void foo(T c) { std::cout << c.c_str(); } 

El auto simplemente reemplaza la template más detallada template . Del mismo modo, puedes escribir

 void foo(Sortable c) 

como una abreviatura de

 template requires Sortable{} 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 la 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.