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。がsetis notconstであるため、begin()呼び出しは a を返すべきではないconst_iteratorため、反復子を逆参照するときに値を移動できるはずです。なぜこれはコンパイルされないのですか?