【问题标题】:What do <: and :> mean when declaring a lambda? [duplicate]声明 lambda 时 <: 和 :> 是什么意思? [复制]
【发布时间】:2016-05-19 09:22:34
【问题描述】:

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

你能解释一下,&lt;:&amp;:&gt; {/* ... */} 是什么意思吗?是否可以通过这种方式声明一个带参数的 lambda?

【问题讨论】:

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


【解决方案1】:

&lt;::&gt;digraphs。它们分别被翻译成[]。因此,您的代码相当于:

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

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

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

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

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

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

【讨论】:

  • 有道理。这确实具有误导性,因为我不明白现在谁以及为什么会使用二合字母。
  • @aadam 是的,你是从哪里看到这段代码的?
  • @aadam:我确定您自己编写了此代码,可能是因为您很高兴与他人分享此代码:P
  • @TartanLlama 在这个 SO 答案中:stackoverflow.com/questions/10033142/…
  • 三合字母(但不是二合字母)计划在 C++17 中移除,以防万一您需要另一个不使用它们的理由。
猜你喜欢
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 2013-02-08
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
相关资源
最近更新 更多