Подтвердить что ты не робот

Что означают <: и:> при объявлении лямбда?

Я наткнулся на следующий синтаксис лямбда, который я не понимаю:

#include <iostream>

template<typename Callback>
void do_it(Callback callback) {
        callback();
}

template<typename T>
void p() {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
}

int main() {
        auto a = <:&:> { };
        p<decltype(a)>();
        do_it(<:&:> { std::cout << "Hello" << std::endl; }); //this
}

Программа выше производит вывод:

void p() [with T = main()::__lambda0]
Hello

Не могли бы вы объяснить, что означает <:&:> {/* ... */}? Можно ли объявить этот способ лямбдой, которая принимает аргумент?

4b9b3361

Ответ 1

<: и :> являются орграфами. Они переводятся на [ и ] соответственно. Таким образом, ваш код эквивалентен:

auto a = [&] { };
do_it([&] { std::cout << "Hello" << std::endl; }); 

Так что это просто лямбда, которая захватывает все по ссылке.

Чтобы объявить лямбду, которая принимает такой аргумент, просто добавьте список параметров после группы захвата:

auto a = <:&:> (AType) { };

Если вы хотите, чтобы кто-либо читал ваш код, чтобы вас ненавидеть, вы можете использовать сочетание орграфов и триграфов, где это возможно:

auto a = <:&??)??<%>;
//       ^ same as [&]{}