【问题标题】:C++11 Lambda Passing with Capture [duplicate]C ++ 11 Lambda通过捕获[重复]
【发布时间】:2014-10-22 03:57:58
【问题描述】:

我正在尝试使用捕获 [&] 传递 lambda 函数。存储捕获 lambda 的变量的正确声明是什么? [f2 下面]

// Non-capturing
void (*f1)() = [](){   }; // Works

// All by reference
void (*f2)() = [&](){  }; // Syntax Error

【问题讨论】:

  • 自动 f = [&](){...} ?
  • 无法将带有捕获的 Lambda 转换为函数指针。
  • 请注意,您不是试图通过引用传递 lambda 函数。
  • 措辞不好。我的意思是在 lambda ["&" 捕获模式] 中启用引用
  • @RandomClown:如果您需要有或没有捕获的 lambda 的通用类型,请使用 std::function<void()>。它使用类型擦除来存储具有该签名的任何函数对象。

标签: c++ c++11 lambda


【解决方案1】:

C++ 标准,第 5.1.2 / 6 节:[expr.prim.lambda]

非泛型 lambda 表达式的闭包类型没有 lambda-capture 有一个公共的非虚拟非显式 const 转换函数到指向函数的指针与 C ++ 语言链接 (7.5 ) 具有与闭包类型的函数调用运算符相同的参数和返回类型。这个转换函数的返回值应该是一个函数的地址,当被调用时,它与调用闭包类型的函数调用运算符具有相同的效果

由于您的 lambda 具有捕获(默认捕获:[&]),因此没有指向函数指针的转换运算符。


或者,您可以使用 std::function<> 包装您的 lambda:

#include <functional>
#include <iostream>

int main()
{
  int i = 42;  
  std::function<void(void)> f = [&](){ std::cout << i; };
  f();
}

【讨论】:

  • 谢谢。这太罗嗦了,我自己无法理解。
  • 谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2014-07-09
  • 2016-02-08
  • 1970-01-01
相关资源
最近更新 更多