When moving std::unique_ptr
into the lambda, it is not possible to call reset()
on it, because it seems to be const then:
error C2662: void std::unique_ptr<int,std::default_delete<_Ty>>::reset(int *) noexcept': cannot convert 'this' pointer from 'const std::unique_ptr<int,std::default_delete<_Ty>>' to 'std::unique_ptr<int,std::default_delete<_Ty>> &
#include <memory> int main() { auto u = std::unique_ptr<int>(); auto l = [v = std::move(u)]{ v.reset(); // this doesn't compile }; }
std::unique_ptr
in another way which allows calling reset()
within the lambda (with C++17 or later)?A unique_ptr can only be moved. This means that the ownership of the memory resource is transferred to another unique_ptr and the original unique_ptr no longer owns it.
std::unique_ptr::resetDestroys the object currently managed by the unique_ptr (if any) and takes ownership of p. If p is a null pointer (such as a default-initialized pointer), the unique_ptr becomes empty, managing no object after the call.
Because the unique pointer does not have a copy constructor. Hence you cannot pass it by value, because passing by value requires making a copy.
- Why does this happen?
Because the function-call operator of a lambda,
Unless the keyword
mutable
was used in the lambda-expression, the function-call operator is const-qualified and the objects that were captured by copy are non-modifiable from inside thisoperator()
.
and
- Is it possible to capture the
std::unique_ptr
in another way which allows to callreset()
within the lambda
You need to mark it mutable
.
mutable: allows body to modify the parameters captured by copy, and to call their non-const member functions
e.g.
auto l = [v = std::move(u)]() mutable { v.reset(); };
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With