How to capture a unique_ptr into a lambda expression?
Solution 1:
This issue is addressed by lambda generalized capture in C++14:
// a unique_ptr is move-only
auto u = make_unique<some_type>(some, parameters);
// move the unique_ptr into the lambda
go.run([u = move(u)]{do_something_with(u);});
Solution 2:
You cannot permanently capture a unique_ptr
in a lambda. Indeed, if you want to permanently capture anything in a lambda, it must be copyable; merely movable is insufficient.
This could be considered a defect in C++11, but you would need some syntax to explicitly say that you wanted to move the unique_ptr
value into the lambda. The C++11 specification is very carefully worded to prevent implicit moves on named variables; that's why std::move
exists, and this is a good thing.
To do what you want will require either using std::bind
(which would be semi-convoluted, requiring a short sequence of binds
) or just returning a regular old object.
Also, never take unique_ptr
by &&
, unless you are actually writing its move constructor. Just take it by value; the only way a user can provide it by value is with a std::move
. Indeed, it's generally a good idea to never take anything by &&
, unless you're writing the move constructor/assignment operator (or implementing a forwarding function).