2012-12-10 8 views
6

ले जाएं मैं एक निश्चित प्रकार के लिए चाल कन्स्ट्रक्टर (कोई कॉपी कन्स्ट्रक्टर) लागू करना चाहता हूं जिसे boost::unordered_map में मान प्रकार होना चाहिए। आइए इस प्रकार को Composite पर कॉल करें।कन्स्ट्रक्टर और प्रारंभिक सूची

struct Base 
{ 
    Base(..stuff, no default ctor) : initialization list {} 
    Base(Base&& other) : initialization list {} 
} 

struct Composite 
{ 
    Base member; 
    Composite(..stuff, no default ctor) : member(...) {} 
    Composite(Composite&& other) : member(other.member) {} // <---- I want to make sure this invokes the move ctor of Base 
} 

मैं लिखने के लिए यह इतना boost::unordered_map< Key , Composite > प्रति निर्माता की आवश्यकता नहीं है चाहते हैं, और सिर्फ इस कदम निर्माता का उपयोग करता है:

Composite निम्नलिखित हस्ताक्षर हैं। यदि संभव हो, तो Composite के चालक कन्स्ट्रक्टर की आरंभिक सूची में Base की कॉपी कन्स्ट्रक्टर का उपयोग नहीं करना चाहता हूं।

क्या यह संभव है?

उत्तर

11

member(std::move(other.member)) कहें।

एक सुनहरा नियम के रूप में, जब भी आप rvalue संदर्भ द्वारा कुछ ले, आप std::move अंदर इसका इस्तेमाल करने की जरूरत है, और जब भी आप सार्वभौमिक संदर्भ (&& साथ अर्थात निष्कर्ष निकाला टेम्प्लेटेड प्रकार) से कुछ लेते हैं, आप std::forward अंदर इसका इस्तेमाल करने की जरूरत है। अपेक्षाकृत नए शब्द * सार्वभौमिक संदर्भ * के अच्छे उपयोग के लिए

+1

+1। – mavam

+1

@MatthiasVallentin: यह शब्द स्कॉट मेयर्स द्वारा स्पॉट पर विकसित किया गया था। मानक समिति आजकल "अग्रेषण संदर्भ" शब्द पसंद करती है। –

+0

हम अब लगभग दो साल हैं, यह देखकर खुशी हुई कि समुदाय स्थिर अवधि में परिवर्तित हो गया है। – mavam

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