Co oznaczają ^ () {} i ^ {} w C ++?

10

Niedawno przeczytałem trochę takiego kodu C ++:

setData(total, &user, ^() {
  struct dst_t to = {ip, port};
  sendData(to, data);
});


getData(total, ^{
  recvData(data, NULL);
});

Nigdy nie widziałem ^() {}ani ^{}. Co mieli na myśli? Jakaś anonimowa funkcja?

vego
źródło
3
Czy to zarządzane C ++, czyli C ++ / CLI? Czy to C #?
Thomas Matthews
^na pewno wygląda jak makro, spróbuj przejrzeć #defineinstrukcje. W rzeczywistości możesz uruchomić gccz -Eopcją rozwijania makr:g++ -E main.cpp
neshkeev
Czy to jest skompilowane z clang?
KamilCuk

Odpowiedzi:

3

Trudno znaleźć duplikat z ^() {}symbolami, więc opublikuję odpowiedź.

Są to „bloki”, które są rozszerzeniem kompilatora clang, które tworzy zamknięcia podobne do lambda.

Więcej informacji na wiki oraz w specyfikacji języka dla bloków .

Gdy lista argumentów jest pusta, (void)można ją pominąć, ^ { recvData(data, NULL); }jest taka sama jak ^ void (void) { recvData(data, NULL); }.

KamilCuk
źródło
3
Zauważ, że chociaż działają w kodzie C i C ++, zostały zaprojektowane przede wszystkim wokół świata z celem-c, a jeśli używasz C ++, prawie na pewno powinieneś użyć o wiele bardziej idiomatycznych lambdas i funkcji std :: zamiast nich (chociaż należy zauważyć, że std :: function może przechowywać bloki )
Richard J. Ross III