Jak działa generyczna lambda ( auto
słowo kluczowe jako typ argumentu) w standardzie C ++ 14?
Czy jest oparty na szablonach C ++, w których dla każdego innego typu argumentu kompilator generuje nową funkcję o tej samej treści, ale zastępowanych typach (polimorfizm w czasie kompilacji), czy jest bardziej podobny do generycznych Javy (wymazywanie typów)?
Przykład kodu:
auto glambda = [](auto a) { return a; };
Odpowiedzi:
Ogólne lambdy zostały wprowadzone w
C++14
.Po prostu typ zamknięcia zdefiniowany przez wyrażenie lambda będzie miał operator wywołania oparty na szablonie zamiast zwykłego, nieszablonowego operatora wywołania
C++11
lambd (oczywiście, gdyauto
pojawia się przynajmniej raz na liście parametrów).Więc twój przykład:
Stworzy
glambda
instancję tego typu:Punkt 5.1.2 / 5 wersji standardowej wersji n3690 języka C ++ 14 określa, w jaki sposób definiowany jest operator wywołania typu zamknięcia danego wyrażenia lambda:
Wreszcie:
Jak wyjaśnia powyższy akapit, generyczne lambdy są po prostu cukrem syntaktycznym dla unikalnych, nienazwanych funktorów z operatorem wywołania opartym na szablonie. To powinno odpowiedzieć na Twoje pytanie :)
źródło
int main () { struct X {}; std::vector<X> x; }
)Niestety nie są one częścią C ++ 11 ( http://ideone.com/NsqYuq ):
Przy g ++ 4,7:
Jednak sposób, w jaki można to zaimplementować w C ++ 14 zgodnie z propozycją Portland dla generycznych lambd :
Dałoby to w dużej mierze zwykłe utworzenie anonimowej klasy funktora, ale przy braku typów kompilator wyemitowałby element członkowski oparty na szablonie
operator()
:Lub zgodnie z nowszą propozycją propozycji ogólnych (polimorficznych) wyrażeń lambda
Więc tak, dla każdej permutacji parametrów powstałaby nowa instancja, jednak członkowie tego funktora nadal byliby współużytkowani (tj. Przechwycone argumenty).
źródło
-std=c++1y
.auto
ma takie same zasady odliczania jak klasyczne auto? Jeśli odniesiemy się do analogii opartej na szablonach, oznaczałoby to, że auto nie jest automatyczne, to te same zasady, co dedukcja typu szablonu. Wtedy pytanie brzmi: czy odliczenie szablonowe jest równoważneauto
?static
lubregister
:) Tak czy inaczej, użycieauto
tam oznacza, że pod maską generowany jest normalny szablon. W rzeczywistości lambda zostanie wewnętrznie zastąpiona przez kompilator klasą funktora, aauto
parametr oznacza, żetemplate <T> ... (T ...)
zostanie wyemitowany.Jest to proponowana funkcja C ++ 14 (nie w C ++ 11) podobna (lub nawet równoważna) do szablonów. Na przykład N3559 dostarcza tego przykładu:
źródło