2015-12-15 15 views
7

मैं निम्नलिखित टेम्पलेट वर्ग एक विधि के साथ (नीचे छीन केवल प्रासंगिक भागों को रोकने के लिए) Push में लिखा सी ++ 11 कहा जाता है: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); 
    } 
} 

मेरा प्रश्न है:

मैं std::move या std::forwardPush भीतर का उपयोग कर किया जाना चाहिए?

मुझे यकीन है कि है कि क्या std::unique_ptr<T>&& एक सार्वभौमिक संदर्भ के रूप में उत्तीर्ण और इसलिए move बजाय forward का उपयोग करना चाहिए नहीं कर रहा हूँ।

मैं सी ++ के लिए बिल्कुल नया हूं।

+0

यदि आप किसी मैंगेड भाषा से आ रहे हैं, तो "संदर्भ के लिए" दृष्टिकोण की नकल न करने का प्रयास करें। सी ++ में, ऑब्जेक्ट की सरणी ज्यादातर मामलों में ऑब्जेक्ट की सरणी होनी चाहिए, न कि संदर्भों की एक सरणी जो गतिशील रूप से 'new' के साथ आबादी में आती है। यह याद रखना। –

+0

डुप्लिकेट: http://stackoverflow.com/q/9671749, http://stackoverflow.com/q/7257144। –

+0

टिप के लिए धन्यवाद, 'std :: unique_ptr ' ठीक है 'पुश' को 'टी' के उत्तराधिकारी के उदाहरण दिए जाएंगे? – keith

उत्तर

9

आपको std::move का उपयोग करना चाहिए।

std::unique_ptr<T>&& एक रेवल्यू संदर्भ है, अग्रेषण संदर्भ नहीं *। फ़ंक्शन पैरामीटर में फ़ॉरवर्डिंग संदर्भ T&& जैसा दिखना चाहिए जहां T घटाया गया है, यानी फ़ंक्शन घोषित किए जा रहे फ़ंक्शन का टेम्पलेट पैरामीटर।

* अग्रेषण संदर्भ जिसे आप सार्वभौमिक संदर्भ कहते हैं उसके लिए पसंदीदा नाम है।

संबंधित मुद्दे