Vector of Unique Pointers: Why push_back Rejected and How to Overcome It
In C , we encounter a stumbling block when attempting to store unique pointers in vectors. Vector containers expect elements that allow copying, while unique pointers strictly adhere to the principle of unique ownership.
Consider the following snippet:
std::vector<std::unique_ptr<int>> vec; int x(1); std::unique_ptr<int> ptr2x(&x); vec.push_back(ptr2x); // Compiler error: attempt to copy unique pointer
The error stems from the unique_ptr's design to ensure exclusive ownership. Copying a unique_ptr would violate this fundamental property, compromising its core purpose.
Moving to Solve the Dilemma
To resolve this issue, we must utilize the "move" operation rather than copying. The move operation transfers ownership from one container to another, ensuring no duplication.
vec.push_back(std::move(ptr2x));
With this modification, the code successfully inserts the unique_ptr into the vector, maintaining its exclusive ownership.
A Cautionary Note
It is crucial to note that using a unique_ptr to manage a pointer to a local variable like 'x' is not recommended. Local variables are automatically handled during block exit (e.g., function return in this case). Instead, you should allocate the object dynamically.
std::unique_ptr<int> ptr(new int(1));
In C 14, we can simplify this further using make_unique:
std::make_unique<int>(5);
The above is the detailed content of Why Can't I `push_back` Unique Pointers into a Vector, and How Do I Fix It?. For more information, please follow other related articles on the PHP Chinese website!