声明 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 [&]{}
我偶然发现了以下我不理解的 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 [&]{}