C ++ 0x lambda按值捕获总是const?

Posted

技术标签:

【中文标题】C ++ 0x lambda按值捕获总是const?【英文标题】:C++0x lambda capture by value always const? 【发布时间】:2011-02-19 14:35:00 【问题描述】:

有什么方法可以按值捕获,并使捕获的值非常量?我有一个库函子,我想捕获并调用一个非常量但应该是的方法。

以下内容无法编译,但将 foo::operator() const 修复。

struct foo

  bool operator () ( const bool & a )
  
    return a;
  
;


int _tmain(int argc, _TCHAR* argv[])

  foo afoo;

  auto bar = [=] () -> bool
    
      afoo(true);
    ;

  return 0;

【问题讨论】:

【参考方案1】:

使用可变的。


auto bar = [=] () mutable -> bool ....

如果没有 mutable,您将声明 lambda 对象的 operator () const。

【讨论】:

【参考方案2】:

还有使用 mutable 的替代方法(Crazy Eddie 提出的解决方案)。

使用 [=],您的块可以按值捕获所有对象。您可以使用 [&] 通过引用捕获所有对象:

auto bar = [&] () -> bool

或者您可以通过引用仅捕获某些对象[=, &afoo]

auto bar = [=, &afoo] () -> bool

有关详细信息,请参阅此页面(说明部分): http://en.cppreference.com/w/cpp/language/lambda

【讨论】:

这完全不同。它们不可互换。这没有回答 OP 的问题。 这个解决方案的问题是它对捕获的局部变量在执行lambda之前销毁(例如,当你启动一个分离的std::thread时)不起作用。

以上是关于C ++ 0x lambda按值捕获总是const?的主要内容,如果未能解决你的问题,请参考以下文章

在 C++11 中按值或引用使用 lambda 默认捕获的缺点?

如何在lambda中按值捕获`this`和局部变量?

在 lambda 中,引用的按值捕获是不是会复制底层对象?

Lambda 按值捕获和“可变”关键字

将 lambda 中捕获的 const 值用作模板参数是不是合法?

第18课 捕获机制及陷阱