18

次のラムダ構文に出くわしましたが、理解できません:

#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

とは<:&:> {/* ... */}どういう意味ですか? このように引数を取るラムダを宣言することは可能ですか?

4

1 に答える 1

42

<::>有向グラフです。[それらはそれぞれおよびに変換され]ます。そのため、コードは次と同等です。

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

したがって、参照によってすべてをキャプチャするラムダにすぎません。

このような引数を取るラムダを宣言するには、キャプチャ グループの後にパラメーター リストを追加するだけです。

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

あなたのコードを読んだ人に嫌われるようにしたい場合は、可能な限り digraph と trigraph を組み合わせて使用​​できます。

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