मैं हाल ही में रावल संदर्भों के साथ खेल रहा हूं और मुझे एक अजीब समस्या का सामना करना पड़ रहा है। के शामिल है कि फू नामित कुछ सरल वर्ग को परिभाषित करते हैं एक vector<int>
:प्रारंभिक सूचियों के भीतर Rvalue संदर्भ उपयोग
class Foo
{
public:
Foo(std::vector<int>&& v)
: v_(v)
{}
private:
std::vector<int> v_;
};
एक Foo
उदाहरण इस तरह एक vector<int>
अस्थायी पास करके निर्माण किया जा सकता:
std::vector<int> temp;
Foo(std::move(temp));
अब, जब मैं इस कोड के माध्यम से कदम करने की कोशिश की , मैंने देखा कि Foo
के अंदर वेक्टर को चालक के बजाय कॉपी-कन्स्ट्रक्टर का उपयोग करके बनाया गया है। हालांकि, अगर मैं निर्माता के बजाय इस तरह से निर्दिष्ट करें:
Foo(std::vector<int>&& v)
: v_(std::move(v))
{}
फिर, v_
सदस्य की चाल-निर्माता उचित रूप से कहा जाता है। ऐसा क्यों हैं? प्रारंभिक सूची में अनावश्यक std::move(v)
आवश्यक क्यों है? कंप्रेसर वेक्टर मूव-कन्स्ट्रक्टर को कॉल करने के इरादे को कम करने में असमर्थ क्यों है क्योंकि संबंधित Foo
कन्स्ट्रक्टर तर्क को रावल्यू संदर्भ के रूप में निर्दिष्ट किया गया है?
वैसे, मैं -std = C++ 0x विकल्प के साथ जीसीसी 4.6 का उपयोग कर रहा हूं।
आपकी मदद के लिए धन्यवाद। पीएमजे
तो आप ऑब्जेक्ट को मूल्य से ले कर एक ही प्रभाव प्राप्त कर सकते हैं (हालांकि 1 और चालक कन्स्ट्रक्टर कॉल के साथ)। कॉलर 'std :: move' का उपयोग करता है, और कन्स्ट्रक्टर' std :: move' का उपयोग करता है। 2 रचनाकार, लेकिन कोई आवंटन नहीं। –
@ बो पर्सन: आपको स्पष्ट उत्तर धन्यवाद। मैंने कई बार रावल्यू तर्क को संदर्भित करने से उत्पन्न होने वाले मुद्दे के बारे में सोचा नहीं था। @ निकोल बोलस: मुझे यकीन नहीं है कि मैं आपकी बात समझता हूं, क्या आप कृपया कुछ उदाहरण दे सकते हैं? धन्यवाद। – pmjobin