Próbuję. lambda przyjmująca jako parametr funkcję przyjmująca wskaźnik do wydedukowanego typu, zwracająca wskaźnik do tablicy wskaźników do funkcji zwracających wskaźnik do tablicy intów. Lambda zwraca wskaźnik do tablicy wskaźników do funkcji zwracających tablicę intów.
int(*(*(*((*X)()))[])())[] to declare X as pointer to function returning pointer to array of pointer to function returning pointer to array of int
czyli parametrem jest wskaźnik na funkcję przyjmującą zero argumentów i zwracającą wskaźnik do tablicy wskaźników do funkcji zwracających wskaźnik do tablicy intów.
@Helmans: Wiesz, właśnie sprawdziłem i wydaje się to extensionem gcc, a nie standardowym zachowaniem (chociaƶ msvc teƶ się nie czepia). Ale moƶna w przykładzie
@KrzaQ2: no ja jestem uwalony na borlandzie i tutaj takie rzeczy nie przechodzą. Dlatego nie wydaje mi się, że jest to standardowe zachowanie. Ale może się mylę :)
[](int(*(*(*((*$)()))[])())[])->int(*(*(*)[])())[] { return $?$():0; }(0);
#cpp #programowanie #kq
$
to poprawna nazwa zmiennej w cpp
Close, but no cigar.
w/g cdecl
int(*(*(*((*X)()))[])())[]
to declare X as pointer to function returning pointer to array of pointer to function returning pointer to array of int
czyli parametrem jest wskaźnik na funkcję przyjmującą zero argumentów i zwracającą wskaźnik do tablicy wskaźników do funkcji zwracających wskaźnik do tablicy intów.
Typ zwracany ok.
$
podmienić na
_
i wiele czytelniej nie będzie.
$
, cała reszta to lambda z C++11 i zapis typów bez zmian od C89. Jak widać na podlinkowanym ideone, gcc spokojnie to kompiluje.
$
nie jest poprawną nazwą atomu, jednak GCC obsługuje to jako rozszerzenie (bo ten znak nie jest nigdzie używany).
(gdb) p $
$1 = (int (* (* (* (*)(void) )[ ]) (void) )[ ]) 0x0
jak wstawić otwarcie nawiasu tuż za pierwszym [ ] i zamknięcie nawiasu tuż za ostatnim [ ] to wywala błąd kompilacji
[]((int(*(*(*((*$)()))[])())[])->int(*(*(*)[])())[]) { return $?$():0; }(0);
?
Jeśli tak to nic dziwnego, bo syntax lambdy wygląda w tym przypadku tak:
[](argumenty) -> zwracany_typ { ciało; }
, więc onawiasowanie
[]((argumenty) -> zwracany_typ) { ciało; }
jest bez sensu
0
to brzydki i nieczytelny (a to było celem tutaj) podania
nullptr