c ++ 14 wprowadził generyczne lambdy, które umożliwiły napisanie:
auto func = [](auto a, auto b){
return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
Jest bardzo jasne, że ta ogólna lambda func
działa tak, jak działałaby funkcja szablonowa func
.
Dlaczego komisja C ++ zdecydowała się dodać składnię szablonów dla ogólnej lamdy?
c++
c++14
c++20
generic-lambda
coder3101
źródło
źródło
Odpowiedzi:
Lambdy generyczne w C ++ 14 to bardzo fajny sposób na wygenerowanie funktora o
operator ()
podobnym wyglądzie:Ale nie tak:
Ani tak:
Ani w ten sposób (chociaż faktycznie jest to trochę trudne w użyciu):
Lambdy C ++ 14 są w porządku, ale C ++ 20 pozwala nam implementować te przypadki bez kłopotów.
źródło
(auto a, decltype(a) b)
w C ++ 14.b
nie jest dedukowana, a jego argument zostanie niejawnie przekonwertowany na typa
zamiast.Ponieważ możesz używać szablonów lambd w C ++ 20, możesz ograniczyć swoje typy w łatwiejszy sposób niż wyrażenie SFINAE:
Ta lambda będzie działać tylko z typami wektorów.
źródło
consteval
związek z nową składnią? To fajne iw ogóle, ale nie rozumiem znaczenia.Propozycja , która została przyjęta do C ++ 20 ma długi odcinek motywacji, z przykładami. Założenie jest takie:
Poniżej znajduje się kilka przykładów.
źródło
(źródło: iteracja w czasie kompilacji z lambdami C ++ 20 )
Inną interesującą rzeczą, którą można zrobić zarówno na generycznych lambdach C ++ 14, jak i C ++ 17, jest bezpośrednie wywołanie
operator()
przez jawne przekazanie parametru szablonu:C ++ 14:
C ++ 20:
Powyższy przykład C ++ 14 jest całkiem bezużyteczny: nie ma możliwości odniesienia się do typu podanego
operator()
w treści lambdy bez podania nazwy argumentu i użyciadecltype
. Dodatkowo jesteśmy zmuszeni do przekazania argumentu, nawet jeśli możemy go nie potrzebować.Przykład C ++ 20 pokazuje, jak T jest łatwo dostępny w treści lambda i że zerową wartość lambda można teraz dowolnie określać za pomocą szablonu. Będzie to bardzo przydatne do implementacji wyżej wymienionych konstrukcji w czasie kompilacji
źródło