Для чего используются «блоки» в C ++, когда у нас есть функции и лямбды? - PullRequest
0 голосов
/ 17 июня 2020

Я обнаружил эту странную конструкцию, которая, по-видимому, пришла из C и принята в Objective- C и C ++ (как расширение). Для него есть даже новая разработка в clang . Я был очень удивлен, когда увидел это, и я никогда не видел, чтобы кто-нибудь этим пользовался.

Согласно спецификациям, похоже, что вы можете объявлять «блоки» с помощью синтаксиса:

// Declaration
int (^x)(char);
void (^z)(void);
int (^(*y))(char) = &x;

// Invocation
x('a');
(*y)('a');
(true ? x : *y)('a')

Все переменные в блоке являются константными. Почему это полезно?

Блок, который ссылается на эти переменные, будет импортировать переменные как константные вариации. cppreference). Есть ли у кого-нибудь какие-либо ссылки или историческая справка о том, почему они существуют и для чего они используются?

ПРИМЕЧАНИЕ. Мне было достаточно ясно сказано, что это расширение C ++, которое, вероятно, поддерживает clang. У меня все еще остается вопрос - зачем нам это нужно?

1 Ответ

1 голос
/ 17 июня 2020

Это Objective- C (или Objective-C ++) для блока и эквивалентно лямбдам в C ++. Например, блок

int (^sqr)(int) = ^(int x) {return x*x};

может выглядеть так в C ++:

auto sqr = [](int x) {return x*x;}

clang поддерживает как Objective- C, так и Objective-C ++.

...