2014-09-16 7 views
23

gcc 4.9 pozwala na następujący kod, ale gcc 4.8 i clang 3.5.0 go odrzucają.Czy auto jako parametr w zwykłej funkcji ma rozszerzenie GCC 4.9?

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

uzyskać warning: ISO C++ forbids use of 'auto' in parameter declaration [-Wpedantic] w 4.9, ale w 4.8 i brzękiem uzyskać error: parameter declared 'auto'.

+1

Z gcc 4.9.1, 'g ++ -std = C++ 11' daje mi" ostrzeżenie: użycie "auto" w deklaracji parametrów dostępne tylko z -std = C++ 1y lub -std = gnu ++ 1y ". W przypadku 'g ++ -std = C++ 14' nie ma żadnego ostrzeżenia. –

+5

@KeithThompson, Weird, zdecydowanie nie jest częścią C++ 14 (lambdas, yes, but not other functions). – chris

+0

@chris: Gra z gcc 4.9.1, [tutaj jest przykład] (http://codepad.org/mm1jRI4X). Kompilator używany przez codepad.org nie obsługuje go, ale otrzymuję 4 linie wyjściowe o oczekiwanym rozmiarze i wartości w każdej linii. Podobno 'foo' działa jak szablon. –

Odpowiedz

16

Tak, to jest rozszerzenie. Prawdopodobnie zostanie dodany do C++ 17 jako część propozycji "koncepcji".

+9

'Prawdopodobnie zostanie dodany do C++ 17 jako część propozycji" koncepcji ", wierzę." Rzeczywiście, znane jako [funkcje ogólne] (http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2014/n4040.pdf) ([dcl.fct]). – user657267

+1

@ user657267 Sformułowanie użyte w tym dokumencie [Concepts Technical Specification] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4333.pdf) wydaje się być "funkcją skróconą" Szablony ". –

+1

@ JonathanMee Dobrze wiedzieć, myślę, że "funkcja ogólna" była zbyt ... ogólna. – user657267

11

To Concepts Lite mówić za

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

auto prostu zastępuje bardziej gadatliwy template<class T>. Podobnie można napisać

void foo(Sortable c) 

jako skrót dla

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

Tutaj, Sortable jest pojęciem, które jest realizowane w postaci koniunkcji constexpr orzeczników że sformalizowanie wymagania dotyczące parametru szablonu. Sprawdzanie tych wymagań odbywa się podczas wyszukiwania nazwy.

W tym sensie auto jest szablonem całkowicie nieograniczonym.

Powiązane problemy