为什么不可变的lambda捕获可以被移动?

时间:2017-12-12 14:40:08

标签: c++ lambda c++14 move-semantics

AFAIK非可变lambdas捕获变量为const。这让我想知道为什么他们仍然会被感动?

auto p = std::make_unique<int>(0);
auto f = [p = std::move(p)](){ p->reset(); }; // Error, p is const
auto f2 = std::move(f); // OK, the pointer stored inside lambda is moved

1 个答案:

答案 0 :(得分:19)

  

AFAIK非可变lambdas捕获变量为const。

不,他们没有。他们的operator()重载是const。实际的成员变量不是。

与以下内容没有区别:

class A
{
  unique_ptr<int> p
public:
  //Insert constructors here.

  void operator() const {p->reset();}
};