5

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ため、反復子を逆参照するときに値を移動できるはずです。なぜこれはコンパイルされないのですか?

4

2 に答える 2

10

セットは const ではないかもしれませんが、その中の要素は const です。セットの要素を変更することはできません。不変条件が維持されていることを保証できないためです。

于 2013-08-13T05:40:24.013 に答える