3

VS2010

unique_ptr私は内部を持つ構造を持っています。次にvector、この構造を持っています。ベクトルのサイズを変更 (または予約を使用) しようとすると、コンパイル エラーが発生します。以下は、まだ問題が発生している簡略化された例です。

struct Test
{
    unique_ptr<int> pValue;
};

void test()
{
    // this doesn't compile
    vector<Test> testVector;
    testVector.resize(5);

    // this also doesn't compile
    testVector.reserve(5);

    // this, of course, compiles
    vector<unique_ptr<int>> testVector2;
    testVector2.resize(5);
    testVector2.reserve(5);
}

unique_ptr私が受け取るエラーは、 (代入演算子) のプライベート メンバーへのアクセスに関する苦情です。コンパイラは、 and を動的に構築しようとしていTest &Test::operator =(const Test &)ますTest::Test(const Test &)。サイズ変更操作でこれらの関数のいずれかを呼び出す必要がある理由がわかりません (必要に応じて、デフォルトのコンストラクターを呼び出さないのはなぜですか?)。. _ unique_ptr_const

4

2 に答える 2

6

あなたが自分自身と話しているこの会話を中断するのは嫌いです。:-)

しかし答えは、VS2010 はまだ C++11 仕様を完全に実装していないということです (これには少し時間がかかります)。 Test移動コンストラクターを呼び出すデフォルトの noexcept 移動コンストラクターが必要unique_ptrです。TestVS2010 は、この暗黙の移動コンストラクターを実装していません。その場合、完全な例は期待どおりにコンパイルおよび実行されます。 vector必要に応じて noexcept move コンストラクターを使用して移動します。

于 2012-04-13T18:02:36.107 に答える
0

(質問を書き、投稿することが答えにつながった別のケース)

もちろん、答えunique_ptr<>はコピーセマンティクスがないということです。それでも、電話が必要になるまで、上記の配置を使用することができましたresize()。私が考えていなかったresize()のは、ブロックとその中のアイテムを別のメモリブロックに移動しなければならない可能性があるということです。コピーが行われるのはそのときです。非常に一時的なものですが、それでもunique_ptr<>コピー中の一意性に違反します。

さらに私を混乱させたのは、unique_ptr<>コピーセマンティクスvector<unique_ptr<>>がないため、どちらも機能しないはずだということです。しかし、答えは、この場合のためにテンプレートの特殊化が書かれているということでなければなりません。

vector<Test>ベクトルクラスがデフォルトで行う怠惰なコピーを回避し、したがって上記のコンパイラエラーを回避するテンプレートの特殊化を作成することもできます。しかし、この構造体の私の使用法はパフォーマンスを必要としないので、代わりにshared_ptr<>そのコピーセマンティクスでそれを使用することは私が必要とするすべてを達成します。

于 2012-04-13T12:03:11.323 に答える