簡體   English   中英

可以將右值移動到shared_ptr中

[英]Can an rvalue be moved into a shared_ptr

是否可以將rvalue “移動”到shared_ptr 到目前為止,我嘗試過的所有方法都會產生副本。

我想要的使用模式是:

class Element {
public:
    Element(const string &);
    Element(const Element &) = delete; //delete copy constructor
    // ...
};

class MyCollectionOfElements {
public:
    void add(Element &&); // add by rvalue
    // ...
protected:
    vector<shared_ptr<Element>> elements;
};

MyCollectionOfElements elements;
elements.add(Element("something"));

我有理由想要這種模式,並且理解存在自然有效的替代模式(例如,將新Element作為指針而不是rvalue傳遞)。

我當前的懷疑是傳入的rvalue是在堆棧上,而我需要在堆上將它存儲在shared_ptr ,因此副本是不可避免的。

是:

void add(Element && e)
{
    elements.push_back(std::make_shared<Element>(std::move(e)));
}

您還必須確保您的類實際上一個移動構造函數:

class Element
{
public:
    Element(Element &&) = default;
    // ...
};

通過聲明復制構造函數,可以禁止移動構造函數的隱式聲明,因此需要顯式聲明它。

猜猜你誤解了運動語義的概念。 你必須將指針傳遞給智能指針,指針可以有任何類型 - 左值/右值

    void f(A *&&p) {}

接受rvalue ref到指向A的指針的函數; 但是p仍然是lvalue,它具有指針的類型r值引用,所以你必須“強制轉換”(std :: move - 什么都不做,只是將l值轉換為r值)std :: shared_ptr(std :: move) (p));

    A *g() { return new A;}
    A *a;
    f(a);//error        
    f(g());//works fine
    f(new A());//also fine

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM