C++11 introduced by default several of the smart pointer types, e.g., unique pointers, shared pointers, etc. One of the features it was lacking was the ability to pass in a unique_ptr into a lambda expression. For example, the following wouldn’t work:
void aFunction(std::unique_ptr<MyClass> aPtr) {
// do something with aPtr
}
int main() {
// declare a unique_ptr of MyClass
std::unique_ptr<MyClass> aPtr(new MyClass());
// Would like to transfer ownership of aPtr to the lambda expression
// to be executed in a separate thread. But it errors out during
// compile
std::thread aThread([aPtr] { aFunction(std::move(aPtr)); });
aThread.join();
return 0;
}
This is because lambda’s capture list requires a copyable object to be passed in. However, a unique_ptr is not a copyable object. The compilation error tells you that explicitly:
/usr/include/c++/4.9/bits/unique_ptr.h:356:7: note: declared here
unique_ptr(const unique_ptr&) = delete;
In C++14, the standard is updated to allow via Lambda generalized capture. However, I have not be able to get it working for the above example on XCode 8.0.
