C ++ 0x Lambda按值捕获始终是const吗?


102

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

以下代码不会编译,但通过使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;
}

Answers:


165

使用可变的。


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

如果没有可变,则声明了lambda对象const的operator()。


-5

有使用可变的替代方法(由Crazy Eddie提出的解决方案)。

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

auto bar = [&] () -> bool

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

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

请参阅此页面以获取详细信息(“ 说明”部分):http : //en.cppreference.com/w/cpp/language/lambda


11
这会做完全不同的事情。它们不可互换。这没有回应OP的问题。
爱德华·斯特朗奇

1
此解决方案的问题在于,它不适用于在执行lambda之前(例如,当您启动分离的std :: thread时)销毁的捕获的局部变量。
西蒙·尼农
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.