0
    vector<Universe*> vtd;
    Sweet* ptr = new Sweet();
    vtd.push_back(ptr); <--- WORKS FINE!

    vector<unique_ptr<Universe>> vtd;
    unique_ptr<Sweet> X (new Sweet());
    vtd.push_back(X); <--- Intellsense error!

raw poiner を unique_ptr に置き換えるだけでは、このシナリオで機能しないのはなぜですか?

宇宙はクラスであり、

Sweet: Univers は派生クラスです

4

2 に答える 2

2

その背後にstd::unique_ptrある理由は、ポインターの所有者は常に 1 人しか存在できないためstd::unique_ptrです。

std::vector::push_back通常、引数のコピーを作成してこのコピーを保存しますが、 a をコピーできないstd::unique_ptrため、何らかのアクションを実行しない限り失敗します。

std::unique_ptra を a の中に格納するには、所有権を vector に入れるstd::vector必要がありstd::move、持っているものを無効にします。


std::vector<std::unique_ptr<Obj>> vec;

std::unique_ptr<Obj> my_ptr (new Obj);

vec.push_back (std::move (my_ptr)); /* `vec` now owns the pointer,
                                       my_ptr points to nothing    */
于 2013-07-27T16:19:36.197 に答える
0

試すvtd.push_back(std::move(X))

于 2013-07-27T16:18:43.710 に答える