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

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

我偶然发现了以下我不理解的 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?

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

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

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

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

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

如果你想让读你代码的人讨厌你,你可以尽可能混合使用二字母和三字母:

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