18

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

4

1 回答 1

42

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

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

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

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

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

如果您希望任何阅读您的代码的人讨厌您,您可以尽可能混合使用二合字母和三合字母:

auto a = <:&??)??<%>;
//       ^ same as [&]{}
于 2016-05-19T09:25:39.200 回答