È automatico come parametro in una funzione regolare un’estensione GCC 4.9?

gcc 4.9 consente il seguente codice, ma gcc 4.8 e clang 3.5.0 lo rifiutano.

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

Ricevo un warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic] in 4.9 ma in 4.8 e clang ottengo error: parameter declared 'auto' .

Sì, questa è un’estensione. È probabile che venga aggiunto a C ++ 17 come parte della proposta di “concetti”, credo.

Questo è Concepts Lite per cui parlare

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

L' auto sostituisce semplicemente il template più dettagliato template . Allo stesso modo, puoi scrivere

 void foo(Sortable c) 

come una scorciatoia per

 template requires Sortable{} void foo(T c) 

Qui, Sortable è un concetto, che viene implementato come una combinazione di predicati di constexpr che formalizzano i requisiti sul parametro del template. Il controllo di questi requisiti viene eseguito durante la ricerca del nome.

In questo senso, auto è un modello completamente non vincolato.