2014-09-16 16 views
23

gcc 4.9 erlaubt den folgenden Code, aber gcc 4.8 und clang 3.5.0 lehnen es ab.Ist Auto als Parameter in einer regulären Funktion eine GCC 4.9 Erweiterung?

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

ich warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic] in 4.9, aber in 4.8 und Klirren ich error: parameter declared 'auto' bekommen.

+1

mit gcc 4.9.1, 'g ++ -std = C++ 11 'gibt mir„Warnung: Die Verwendung von 'auto' in Parameterdeklaration nur bei -std = C++ 1J oder -std = Gnu ++ 1J ". Mit 'g ++ -std = C++ 14' gibt es keine Warnung. –

+5

@KeithThompson, Seltsam, es ist definitiv nicht Teil von C++ 14 (Lambdas, ja, aber nicht andere Funktionen). – chris

+0

@chris: Herumspielen mit gcc 4.9.1, [hier ein Beispiel] (http://codepad.org/mm1jRI4X). Der von codepad.org verwendete Compiler behandelt das nicht, aber ich bekomme 4 Zeilen mit der erwarteten Größe und dem erwarteten Wert in jeder Zeile. Offenbar verhält sich 'foo' wie eine Vorlage. –

Antwort

16

Ja, das ist eine Erweiterung. Es wird wahrscheinlich zu C++ 17 als Teil des Konzepts "Konzepte" hinzugefügt werden, glaube ich.

+9

'Es wird wahrscheinlich zu C++ 17 als Teil des Konzepts 'Vorschlag hinzugefügt werden, glaube ich. In der Tat bekannt als [generische Funktionen] (http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2014/n4040.pdf) ([dcl.fct]). – user657267

+1

@ user657267 der Wortlaut dieses in den [Konzepte Technische Daten] verwendet (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4333.pdf) scheint „Funktion Abgekürzt werden Vorlagen ". –

+1

@ JonathanMee Gut zu wissen, ich denke "generische Funktion" war auch ... generisch. – user657267

11

Diese Konzepte Lite sprechen für

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

Die auto nur ersetzt die ausführlichere template<class T> ist. Ebenso können Sie für

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

Hier

void foo(Sortable c) 

als Abkürzung schreiben, ist Sortable ein Konzept, das als Verbindung von constexpr Prädikate implementiert, die die Anforderungen an die Template-Parameter formalisieren. Die Überprüfung dieser Anforderungen erfolgt während der Namenssuche.

In diesem Sinne auto ist eine völlig ungezwungene Vorlage.