I have a set
of unique_ptr
instances and want to pass all of them as an argument to a function. Example demonstrated by below code.
#include <memory>
#include <set>
#include <vector>
using std::set;
using std::unique_ptr;
using std::vector;
void doStuff(unique_ptr<int> ptr)
{
// doing stuff...
}
int main()
{
vector<unique_ptr<int>> ptrVector;
set<unique_ptr<int>> ptrSet;
for (auto cur = ptrVector.begin(); cur != ptrVector.end(); cur++)
{
doStuff(std::move(*cur));
}
for (auto cur = ptrSet.begin(); cur != ptrSet.end(); cur++)
{
doStuff(std::move(*cur));
}
return 0;
}
This results in the following compiler error (GCC 4.8.1):
uptrfncall.cpp: In function ‘int main()’: uptrfncall.cpp:27:25: error: use of deleted function ‘std::unique_ptr::unique_ptr(const std::unique_ptr&) [with _Tp = int; _Dp = std::default_delete]’ doStuff(std::move(*cur)); // line 25, compiler error ^ In file included from /usr/include/c++/4.8/memory:81:0, from uptrfncall.cpp:1: /usr/include/c++/4.8/bits/unique_ptr.h:273:7: error: declared here unique_ptr(const unique_ptr&) = delete; ^ uptrfncall.cpp:9:10: error: initializing argument 1 of ‘void doStuff(std::unique_ptr)’ void doStuff(unique_ptr ptr) ^
Note that it works flawlessly for the vector
but not for the set
. As the set
is not const
, the begin()
call should not return a const_iterator
so it should be possible to move the values when dereferencing the iterator. Why does this not compile?
set::iterator
andset::const_iterator
if I can never modify the elements anyway? – Adjustment