Что означают ^ () {} и ^ {} в C ++?

10

Я недавно прочитал некоторый код C ++, как это:

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


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

Я никогда не видел ^() {}ни ^{}. Что они имеют в виду? Какая-то анонимная функция?

вего
источник
3
Это управляемый C ++, он же C ++ / CLI? Это C #?
Томас Мэтьюз
^уверен, что выглядит как макрос, попробуйте просмотреть #defineзаявления. На самом деле вы можете запустить gccс -Eвозможностью расширения макросов:g++ -E main.cpp
neshkeev
Это скомпилировано с Clang?
KamilCuk
1
Возможно: stackoverflow.com/questions/9201514/…
jxh

Ответы:

3

Трудно найти дубликат с ^() {}символами, поэтому я выложу ответ.

Это «блоки», которые являются расширением clang-компилятора, которое создает лямбда-подобные замыкания.

Больше информации на вики и в clangs. Спецификация языка для блоков .

Когда есть пустой список аргументов, (void)можно опустить, ^ { recvData(data, NULL); }то же самое, что и ^ void (void) { recvData(data, NULL); }.

KamilCuk
источник
3
Обратите внимание, что, хотя они работают в коде C & C ++, они в первую очередь были разработаны для мира Objective-C, и если вы используете C ++, вы почти наверняка должны использовать гораздо более идиоматические лямбда-выражения и std :: function вместо них (хотя обратите внимание, что std :: function может содержать блоки )
Ричард Дж. Росс III,