C++ 在DEQUE之间移动唯一指针

C++ 在DEQUE之间移动唯一指针,c++,c++11,C++,C++11,我有一个容器类,用于一些指向对象的唯一指针 我现在需要取一个,在另一个类中使用它们并将其交给另一个类(在某个时候回收它们并将它们放回容器) 下面是代码的概要。但是,我对使用函数移动唯一指针的正确方法感到困惑: using uptrPod = unique_ptr<Pod>; using dqUptrPods = deque<uptrPods>; class Container { public: Container() : n_elements

我有一个容器类,用于一些指向对象的唯一指针

我现在需要取一个,在另一个类中使用它们并将其交给另一个类(在某个时候回收它们并将它们放回容器)

下面是代码的概要。但是,我对使用函数移动唯一指针的正确方法感到困惑:

using uptrPod =  unique_ptr<Pod>;
using dqUptrPods = deque<uptrPods>;

class Container {
public:
    Container() :
        n_elements_( 500 )
    {
        for ( auto i = 0; i < n_elements_; i++ ) {
        free_pods_.push_back( uptrPod( new Pod()) );
    }

    const uptrPod&& getPod() {
        auto up_pod= std::move( free_pods_[0] );
        free_pods_.erase( free_pods_.begin() );
        return up_pod;
    }

    void returnPod( const uptrPod&& up_pod ) {
        free_pods_.push_back( up_pod );
    }

private:
    long n_elements_;
    dqUptrPods free_pods_;
};

class PodTracker {

    void addPod( const uptrPod&& up_pod ) { dq_pods_.pushback( up_pod ); }
    dqUptrPods dq_pods_;
};

class PodHandler {

    void movePod() {
        up_pod = std::move( container_->getPod() );

        /// do stuff with pod

        pod_tracker_->addPod( up_pod );
    }

    Container* container_;
    PodTracker* pod_tracker_;
};
使用uptrPod=unique\u ptr;
使用dqUptrPods=deque;
类容器{
公众:
容器():
n_元素(500)
{
对于(自动i=0;igetPod());
///用豆荚做东西
吊舱/跟踪器->添加吊舱(向上吊舱);
}
货柜*货柜*;
吊舱跟踪器*吊舱跟踪器;
};
我得到一个错误:

无法将std::unique\u ptr l值绑定到const uptrPod&{aka const std::unique\u ptr&&


如何在类之间传递指针?

通过值传递/返回
std::unique\u ptr
实例,并显式使用
std::move

uptrPod getPod() { 
    auto up_pod= std::move( free_pods_[0] ); 
    free_pods_.erase( free_pods_.begin() );
    return up_pod;
}


请注意,
常量
右值引用
没有多大意义-右值引用

右值引用的主要目的是允许我们移动对象,而不是复制对象。移动对象的状态意味着修改。因此,移动构造函数和移动赋值运算符的规范签名都将其参数作为非常量右值引用


(From:)

通过值传递/返回
std::unique\ptr
实例,并显式使用
std::move

uptrPod getPod() { 
    auto up_pod= std::move( free_pods_[0] ); 
    free_pods_.erase( free_pods_.begin() );
    return up_pod;
}


请注意,
常量
右值引用
没有多大意义-右值引用

右值引用的主要目的是允许我们移动对象,而不是复制对象。移动对象的状态意味着修改。因此,移动构造函数和移动赋值运算符的规范签名都将其参数作为非常量右值引用


(发件人:)

可能值得解释的是,
up\u pod
仍然是一个左值,不管它是否在右值引用中的类型:)这似乎工作得很好…非常感谢Vittorioi可能值得解释的是,
up\u pod
仍然是一个左值,不管它是否在右值引用中的类型:)这似乎工作得很好。。。非常感谢维托里奥
class PodTracker{
    void addPod(uptrPod up_pod) { dq_pods_.push_back(std::move(up_pod)); }
    dqSptrPods dq_pods_;
};
void movePod() {

    // `std::move` is not necessary here, as `getPod()`
    // is already a temporary (rvalue)
    auto up_pod = container_->getPod();

    /// do stuff with pod

    pod_tracker_->addPod( std::move(up_pod) ) ;   
}