119

Is there any way to capture by value, and make the captured value non-const? I have a library functor that I would like to capture & call a method that is non-const but should be.

The following doesn't compile but making foo::operator() const fixes it.

struct foo { bool operator () ( const bool & a ) { return a; } }; int _tmain(int argc, _TCHAR* argv[]) { foo afoo; auto bar = [=] () -> bool { afoo(true); }; return 0; } 

2 Answers 2

206

Use mutable.

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

Without mutable you are declaring the operator () of the lambda object const.

Sign up to request clarification or add additional context in comments.

Comments

-5

There is alternative way to using mutable (solution proposed by Crazy Eddie).

With [=] your block captures all objects by values. You can use [&] to capture all objects by reference:

auto bar = [&] () -> bool 

Or you can capture by reference only certain object [=, &afoo]:

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

Refer to this page for fore details (Explanation section): http://en.cppreference.com/w/cpp/language/lambda

2 Comments

This does completely different things. They are not interchangeable. This doesn't respond to the OP's question.
The problem of this solution is that it does not work for captured local variables destroyed before the lambda is executed (for example, when you start a detached std::thread).

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.