什么&lt ;:和:>声明lambda时的意思?

时间:2016-05-19 09:22:35

标签: c++ c++11 lambda digraphs

我偶然发现了以下lambda语法,我不明白:

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="200"
    android:fromXScale=".8"
    android:fromYScale=".8"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fillAfter="true"
    android:toXScale="1.0"
    android:toYScale="1.0" >
</scale>

上面的程序会产生一个输出:

#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?

1 个答案:

答案 0 :(得分:42)

<::>digraphs。它们分别被翻译为[]。因此,您的代码等同于:

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

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

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

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

如果你想要任何阅读你代码的人讨厌你,你可以尽可能使用有向图和三字符组合:

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