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.