2011-01-29 10 views
11

पर विचार निम्नलिखित:क्या विभिन्न वर्गों से चालकों को स्थानांतरित करना आवश्यक है?

struct X 
{ 
    Y y_; 

    X(const Y & y) :y_(y) {}  
    X(Y && y) :y_(std::move(y)) {} 
}; 

यह आदेश चाल अर्थ विज्ञान का पूरा लाभ लेने के लिए एक दूसरे की तरह एक निर्माता परिभाषित करने के लिए आवश्यक है? या उचित परिस्थितियों में स्वचालित रूप से इसका ख्याल रखा जाएगा?

+0

एक चालक कन्स्ट्रक्टर या असाइनमेंट ऑपरेटर निश्चित रूप से उत्पन्न होता है [कुछ परिस्थितियों में] (http://stackoverflow.com/questions/4819936/why-no-default-move-assignment-move-constructor/4820339#4820339)। चूंकि आपने यहां एक कॉपी कन्स्ट्रक्टर घोषित कर दिया है, इसलिए आपको एक उचित चालक स्वयं को घोषित और परिभाषित करना होगा। हालांकि, आप उन दोनों को हटा सकते हैं और आपके विशिष्ट मामले में एक ही व्यवहार कर सकते हैं। –

+1

@ जेम्स: हंडी जानकारी। हालांकि, मैंने यहां एक कॉपी कन्स्ट्रक्टर को परिभाषित नहीं किया है। मैंने वाई से एक्स –

+0

ओह से एक निर्माता को परिभाषित किया। इसके बारे में खेद है, मैंने केवल पत्र देखे और अनुमान लगाया कि वे सब एक जैसे थे। –

उत्तर

7

हाँ, लेकिन नहीं। आपका कोड सिर्फ इस होना चाहिए:

struct X 
{ 
    Y y_; 

    X(Y y) : // either copy, move, or elide a Y 
    y_(std::move(y)) // and move it to the member 
    {} 
}; 

तो आप कभी भी डिजाइन में कहते हैं कि * है, तो आप सिर्फ तर्क मान द्वारा लेने के लिए और जहां यह होने की जरूरत है पर ले जाते हैं चाहिए "मैं इस डेटा का अपने ही प्रति की जरूरत है" । यह तय करना आपका काम नहीं है कि उस मूल्य को कैसे बनाया जाए, यह उस मूल्य के लिए उपलब्ध रचनाकारों पर निर्भर है, इसलिए इसे वह विकल्प दें, जो भी हो, और अंतिम परिणाम के साथ काम करें।

* यह भी कार्यों पर लागू होता है, ज़ाहिर है, उदाहरण के लिए:

void add_to_map(std::string x, int y) // either copy, move or elide a std::string 
{ 
    // and move it to where it needs to be 
    someMap.insert(std::make_pair(std::move(x), y)); 
} 

ध्यान दें कि सी ++ 03 भी में लागू किया जाता है, कुछ हद तक, अगर एक प्रकार डिफ़ॉल्ट constructible और swappable था (जो सभी चल रहा है वैसे भी):

// C++03 
struct X 
{ 
    std::string y_; 

    X(std::string y) // either copy or elide a std::string 
    { 
     swap(y_, y); // and "move" it to the member 
    } 
}; 

हालांकि यह व्यापक रूप से व्यापक प्रतीत नहीं होता था।

+0

बिल्कुल वही जो मैं खोज रहा था, एक समारोह में उन्हें करने का एक तरीका। धन्यवाद जीएमएन। –

1

हां, यह आवश्यक है। एक कॉन्स रेफ केवल एक प्रतिलिपि हो सकती है, न कि एक कदम।

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