可以将右值移动到shared_ptr中

Ell*_*ods 4 c++ rvalue-reference c++11

是否有可能将'移动' 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"));
Run Code Online (Sandbox Code Playgroud)

我有理由想要这种模式,并且理解存在自然有效的替代模式(例如将新Element的指针作为指针而不是指针传递rvalue).

我当前的怀疑是传入rvalue是在堆栈上,而我需要在堆上将它存储在一个堆栈中shared_ptr,因此副本是不可避免的.

Ker*_* SB 10

是:

void add(Element && e)
{
    elements.push_back(std::make_shared<Element>(std::move(e)));
}
Run Code Online (Sandbox Code Playgroud)

您还必须确保您的类实际上一个移动构造函数:

class Element
{
public:
    Element(Element &&) = default;
    // ...
};
Run Code Online (Sandbox Code Playgroud)

通过声明复制构造函数,可以禁止移动构造函数的隐式声明,因此需要显式声明它.

  • @ElliotWoods:你的问题没有说明你有'this`指针应该保持不变 - 你应该在问题中澄清这一点.可能无法避免更改`this`指针(但这是移动与复制相比的另一个问题). (3认同)