Что означают ^ () {} и ^ {} в 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


Ответы:


3

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

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

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

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


3
Обратите внимание, что, хотя они работают в коде C & C ++, они в первую очередь были разработаны для мира Objective-C, и если вы используете C ++, вы почти наверняка должны использовать гораздо более идиоматические лямбда-выражения и std :: function вместо них (хотя обратите внимание, что std :: function может содержать блоки )
Ричард Дж. Росс III,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.