mardi 6 janvier 2015

Capture and move a unique_ptr in a c++14 lambda expression

I am capturing a unique_ptr in a lambda expression this way:



auto str = make_unique<string>("my string");
auto lambda = [ capturedStr = std::move(str) ] {
cout << *capturedStr.get() << endl;
};
lambda();


It works great until I try to move capturedStr to another unique_ptr. For instance, the following is not working:



auto str = make_unique<string>("my string");
auto lambda = [ capturedStr = std::move(str) ] {
cout << *capturedStr.get() << endl;
auto str2 = std::move(capturedStr); // <--- Not working, why?
};
lambda();


Here is the output from the compiler:



.../test/main.cpp:11:14: error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr, std::__1::default_delete > >' auto str2 = std::move(capturedStr); ^ ~~~~~~~~~~~~~~~~~~~~~~ ../include/c++/v1/memory:2510:31: note: copy constructor is implicitly deleted because 'unique_ptr, std::__1::default_delete > >' has a user-declared move constructor _LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT ^ 1 error generated.



Why isn't it possible to move capturedStr?


Aucun commentaire:

Enregistrer un commentaire