2014-09-16 16 views
23

gcc 4.9 consente il seguente codice, ma gcc 4.8 e clang 3.5.0 lo rifiutano.È automatico come parametro in una funzione normale un'estensione GCC 4.9?

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

ottengo 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'.

+1

Con gcc 4.9.1, 'g ++ -std = C++ 11' mi dà" avviso: uso di 'auto' nella dichiarazione dei parametri disponibile solo con -std = C++ 1y o -std = gnu ++ 1y ". Con 'g ++ -std = C++ 14' non ci sono avvisi. –

+5

@KeithThompson, Stranamente, non fa assolutamente parte del C++ 14 (lambda, sì, ma non altre funzioni). – chris

+0

@chris: giocare con gcc 4.9.1, [ecco un esempio] (http://codepad.org/mm1jRI4X). Il compilatore usato da codepad.org non lo gestisce, ma ottengo 4 righe di output con le dimensioni e il valore attesi su ciascuna riga. Apparentemente 'foo' si comporta come un modello. –

risposta

16

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

+9

'È probabile che venga aggiunto a C++ 17 come parte della proposta 'concetti', credo. In effetti, noto come [funzioni generiche] (http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2014/n4040.pdf) ([dcl.fct]). – user657267

+1

@ user657267 La dicitura utilizzata per questo nella [Specifiche tecniche di Concepts] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4333.pdf) sembra essere "Funzione abbreviata Modelli". –

+1

@JonathanMee Buono a sapersi, immagino che la "funzione generica" ​​sia troppo ... generica. – user657267

11

Questo è Concetti Lite parlano da

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

Il auto solo sostituisce il più prolisso template<class T>. Allo stesso modo, è possibile scrivere

void foo(Sortable c) 

come una scorciatoia per

template<class T> 
requires Sortable<T>{} 
void foo(T c) 

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

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