set
のインスタンスがunique_ptr
あり、それらすべてを引数として関数に渡したいと考えています。以下のコードで示す例。
#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;
}
これにより、次のコンパイラ エラーが発生します (GCC 4.8.1)。
uptrfncall.cpp: 関数 'int main()' 内: uptrfncall.cpp:27:25: エラー: 削除された関数 'std::unique_ptr::unique_ptr(const std::unique_ptr&) の使用 [with _Tp = int; _Dp = std::default_delete]' doStuff(std::move(*cur)); // 25 行目、コンパイラ エラー ^ /usr/include/c++/4.8/memory:81:0 からインクルードされたファイルで、 uptrfncall.cpp:1 から: /usr/include/c++/4.8/bits/unique_ptr.h:273:7: エラー: ここで宣言 unique_ptr(const unique_ptr&) = 削除; ^ uptrfncall.cpp:9:10: エラー: 'void doStuff(std::unique_ptr)' の引数 1 を初期化しています void doStuff(unique_ptr ptr) ^
vector
では問題なく機能しますが、 では機能しないことに注意してくださいset
。がset
is notconst
であるため、begin()
呼び出しは a を返すべきではないconst_iterator
ため、反復子を逆参照するときに値を移動できるはずです。なぜこれはコンパイルされないのですか?