在deques之间移动独特的指针

时间:2016-11-22 09:09:13

标签: c++ c++11

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

我现在需要选择其中一个,在另一个类中对它们做一些事情并交给另一个类(并在某个时候回收它们并将它们放回容器中)。

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

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_;
};

我收到错误:

  

无法将std :: unique_ptr l值绑定到const uptrPod&amp;&amp; {aka const std :: unique_ptr&amp;&amp;

如何处理类之间的指针?

1 个答案:

答案 0 :(得分:4)

按值传递/返回std::unique_ptr个实例,并明确使用std::move

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

void returnPod( uptrPod up_pod ) { 
    free_pods_.push_back( std::move(up_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) ) ;   
}

example on wandbox

请注意, const右值参考没有多大意义 - 右值参考。

  

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

(来自:"What are const rvalue references good for?"