声明 lambda 时<: 和 :> 是什么意思?

What do <: and :> mean when declaring a lambda?

本文关键字:是什么 意思 gt lt 声明 lambda      更新时间:2023-10-16

我偶然发现了以下lambda语法,我不理解:

#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

你能解释一下<:&:> {/* ... */}是什么意思吗?可以用这种方式声明一个带参数的lambda吗?

<::>是有向图。它们分别被翻译成[]。因此,您的代码相当于:

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

所以它只是一个lambda,通过引用捕获所有内容。

要声明一个接受这样一个参数的lambda,只需在捕获组后面添加一个参数列表:

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

如果你想让读你代码的人恨你,你可以尽可能使用有向图和三向图的组合:

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