[英]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.