2016-02-15 5 views
7

मैं कक्षा में चालक कन्स्ट्रक्टर को अक्षम करना चाहता हूं। आगे बढ़ने के बजाय, मैं कॉपी कन्स्ट्रक्टर पर आधार बनाना चाहता हूं। जब मैं इस कोड को लिखने की कोशिश: संकलन के दौरानचालक को अक्षम करना

class Boo 
{ 
public: 
    Boo(){} 
    Boo(const Boo& boo) {}; 
    Boo(Boo&& boo) = delete; 
}; 

Boo TakeBoo() 
{ 
    Boo b; 
    return b; 
} 

मैं त्रुटि प्राप्त:

error C2280: 'Boo::Boo(Boo &&)': attempting to reference a deleted function

मैं कैसे बजाय चाल निर्माता और बल प्रतियां निष्क्रिय कर सकते हैं?

class Boo 
{ 
public: 
    Boo(){} 
    Boo(const Boo& boo) {}; 
}; 

चाल निर्माता स्वचालित रूप से जब तक उपयोगकर्ता परिभाषित प्रतिलिपि निर्माता तो प्रतिलिपि निर्माता कहा जाता है मौजूद है के रूप में उत्पन्न नहीं कर रहा है:

+6

सिर्फ इस कदम निर्माता ओवरलोड नहीं है और संकलक इसके लिए एक कदम निर्माता उत्पन्न नहीं करेगा क्योंकि वहाँ पहले से ही एक प्रति निर्माता –

+2

मानक से है: "अगर एक दसवीं कक्षा की परिभाषा को स्पष्ट रूप से घोषणा नहीं करता है एक चालक कन्स्ट्रक्टर, एक को निश्चित रूप से डिफॉल्ट के रूप में घोषित किया जाएगा यदि केवल एक्स में उपयोगकर्ता द्वारा घोषित प्रतिलिपि निर्माता नहीं है [...] जब चालक कन्स्ट्रक्टर को पूरी तरह से घोषित या स्पष्ट रूप से आपूर्ति नहीं की जाती है, तो अभिव्यक्तियां जो अन्यथा इस कदम को बुलाती हैं कन्स्ट्रक्टर इसके बजाय एक कॉपी कन्स्ट्रक्टर का आह्वान कर सकता है। " – Pixelchemist

+1

आप इससे क्या हासिल करने की उम्मीद करते हैं? यह किसी भी तरह से सार्थक प्रतीत नहीं होता है। –

उत्तर

17

किसी भी कदम निर्माता न बनाएं।

+6

चालक कन्स्ट्रक्टर स्वचालित रूप से जेनरेट नहीं होता है * यदि एक कॉपी कन्स्ट्रक्टर मौजूद है *। ओपी के उदाहरण में यह मामला है, लेकिन यह इंगित करने लायक है, न कि एक पाठक निष्कर्ष निकाला है कि एक चालक कन्स्ट्रक्टर को लागू नहीं करना चाल से बचने के लिए पर्याप्त है। उदाहरण के लिए, दो 'std :: वेक्टर' सदस्यों वाले वर्ग और निहित रूप से परिभाषित कोई प्रतिलिपि या चालक कन्स्ट्रक्टर एक ऑटो-जेनरेटेड चाल कन्स्ट्रक्टर प्राप्त नहीं करेगा जो वैक्टर को स्थानांतरित करता है। – user4815162342

4

=delete के रूप में फ़ंक्शन को चिह्नित करने से फ़ंक्शन ओवरलोड रिज़ॉल्यूशन के लिए उपलब्ध हो जाता है, लेकिन यदि चुना गया है, तो संकलन विफल हो जाता है; यह कार्यक्षमता रचनाकारों और अन्य विशेष कार्यों तक सीमित नहीं है (see here)। पहले (लगभग सी ++ 03) सदस्य को निजी बनाने के समान परिणाम प्राप्त किया।

इसलिए, नमूना के रूप में कोड प्रभावी ढंग से इसका मतलब है कि आप वर्ग के किसी ऑब्जेक्ट के निर्माण को अस्थायी या समाप्ति मूल्य (रावल) - चालक कन्स्ट्रक्टर से प्रतिबंधित करते हैं।

इसे ठीक करने के लिए, चालक को पूरी तरह से हटा दें। कक्षा के मामले में, एक बार एक प्रतिलिपि निर्माता मौजूद होता है (उपयोगकर्ता परिभाषित), चाल पूरी तरह से उत्पन्न नहीं होती है (कन्स्ट्रक्टर को ले जाएं और असाइनमेंट ऑपरेटर ले जाएं)।

class Boo 
{ 
public: 
    Boo(){} 
    Boo(const Boo& boo) {}; 
    //Boo(Boo&& boo) = delete; 
}; 
+2

अतिरिक्त जानकारी: चालक को चिह्नित करने के रूप में चालक को चिह्नित करना वास्तव में इसे ओवरलोड रिज़ॉल्यूशन के लिए उपलब्ध कराता है; हालांकि यदि चालक-निर्माता को पूरी तरह से हटाए जाने के रूप में परिभाषित किया गया है (उदाहरण के लिए ऐसा होता है यदि किसी सदस्य चर के पास इसके चालक को हटाए गए रूप में परिभाषित किया गया है, या तो स्पष्ट रूप से या स्पष्ट रूप से) तो यह * लोड * रिज़ॉल्यूशन के लिए उपलब्ध नहीं है! (अधिभार संकल्प मजेदार है ...) –

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