2015-12-15 14 views
7

私はこの方法で(のみ関連する部分を含むようにストリップダウン)は、次のテンプレートクラスを持っているがC++ 11で書かれたPushと呼ばれる:のstd ::移動またはSTDパラメータSTDを進め:: :: unique_ptrを<T> &&

template<class T, int Capacity> 
class CircularStack 
{ 
private: 
    std::array<std::unique_ptr<T>, Capacity> _stack; 

public: 
    void Push(std::unique_ptr<T>&& value) 
    { 
     //some code omitted that updates an _index member variable 

     _stack[_index] = std::move(value); 
    } 
} 

私の質問は:

私はPushstd::moveまたはstd::forwardを使用する必要がありますか?

私はstd::unique_ptr<T>&&が普遍的参照としての資格ので、forwardではなくmoveを使用する必要があるかどうかを確認していません。

私はC++を合理的に新しくしています。

+0

管理言語から来ている場合は、「参照先」アプローチを真似しないようにしてください。 C++では、オブジェクトの配列はオブジェクトの配列でなければならず、 'new'で動的に生成される配列の配列ではありません。心に留めておきます。 –

+0

重複:http://stackoverflow.com/q/9671749、http://stackoverflow.com/q/7257144。 –

+0

チップをお寄せいただきありがとうございます。 'T'を継承する型のインスタンスが' Push'で与えられれば、 'std :: unique_ptr 'はOKでしょうか? – keith

答えて

9

std::moveを使用してください。

std::unique_ptr<T>&&は、正参照であり、転送参照*ではありません。関数パラメータの転送参照は、のようになり、Tが導出されます。つまり、関数のテンプレートパラメータが宣言されています。

* 転送参照は、汎用参照と呼ばれるものの優先する名前です。

関連する問題