हाँ, लेकिन नहीं। आपका कोड सिर्फ इस होना चाहिए:
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
}
};
हालांकि यह व्यापक रूप से व्यापक प्रतीत नहीं होता था।
एक चालक कन्स्ट्रक्टर या असाइनमेंट ऑपरेटर निश्चित रूप से उत्पन्न होता है [कुछ परिस्थितियों में] (http://stackoverflow.com/questions/4819936/why-no-default-move-assignment-move-constructor/4820339#4820339)। चूंकि आपने यहां एक कॉपी कन्स्ट्रक्टर घोषित कर दिया है, इसलिए आपको एक उचित चालक स्वयं को घोषित और परिभाषित करना होगा। हालांकि, आप उन दोनों को हटा सकते हैं और आपके विशिष्ट मामले में एक ही व्यवहार कर सकते हैं। –
@ जेम्स: हंडी जानकारी। हालांकि, मैंने यहां एक कॉपी कन्स्ट्रक्टर को परिभाषित नहीं किया है। मैंने वाई से एक्स –
ओह से एक निर्माता को परिभाषित किया। इसके बारे में खेद है, मैंने केवल पत्र देखे और अनुमान लगाया कि वे सब एक जैसे थे। –