2011-08-23 19 views
7

मैं हाल ही में रावल संदर्भों के साथ खेल रहा हूं और मुझे एक अजीब समस्या का सामना करना पड़ रहा है। के शामिल है कि फू नामित कुछ सरल वर्ग को परिभाषित करते हैं एक 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 का उपयोग कर रहा हूं।

आपकी मदद के लिए धन्यवाद। पीएमजे

उत्तर

7

फ़ंक्शन (या कन्स्ट्रक्टर) के अंदर एक नामित पैरामीटर एक लवल्यू है, भले ही इसे एक रावल्यू संदर्भ के रूप में घोषित किया गया हो।

औचित्य है

void foo(std::vector<int>&& v) 
{ 
    bar(v); 
    baz(v); 
    boo(v); 
    buz(v); 
} 

इन कॉल की जिसमें संकलक वस्तु v से ले जाने पर विचार करना चाहिए की तरह कुछ?

उनमें से कोई भी नहीं, जब तक कि आप इसे स्पष्ट रूप से नहीं करते।

+0

तो आप ऑब्जेक्ट को मूल्य से ले कर एक ही प्रभाव प्राप्त कर सकते हैं (हालांकि 1 और चालक कन्स्ट्रक्टर कॉल के साथ)। कॉलर 'std :: move' का उपयोग करता है, और कन्स्ट्रक्टर' std :: move' का उपयोग करता है। 2 रचनाकार, लेकिन कोई आवंटन नहीं। –

+0

@ बो पर्सन: आपको स्पष्ट उत्तर धन्यवाद। मैंने कई बार रावल्यू तर्क को संदर्भित करने से उत्पन्न होने वाले मुद्दे के बारे में सोचा नहीं था। @ निकोल बोलस: मुझे यकीन नहीं है कि मैं आपकी बात समझता हूं, क्या आप कृपया कुछ उदाहरण दे सकते हैं? धन्यवाद। – pmjobin

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