2017-06-21 14 views
26
struct copyable { // and movable 
    copyable() = default; 
    copyable(copyable const&) { /*...*/ }; 
    copyable& operator=(copyable const&) { /*...*/ return *this; } 
}; 

चूंकि प्रतिलिपि निर्माता और कॉपी असाइनमेंट ऑपरेशन फ़ंक्शंस स्पष्ट रूप से परिभाषित किए गए हैं, यह दर्शाता है कि चालक कन्स्ट्रक्टर और चाल असाइनमेंट फ़ंक्शन को संकलक द्वारा स्पष्ट रूप से परिभाषित नहीं किया जा सकता है और इसलिए चालन ऑपरेशन की अनुमति नहीं है।दबाने वाले चाल के साथ एक प्रकार कैसे बना सकता है/असाइन करना अभी भी चलने योग्य माना जा सकता है?

क्या आप कृपया मुझे बता सकते हैं कि मेरी उपरोक्त समझ सही है या नहीं?

+3

मूविंग को एक विशेष मामले के रूप में देखा जा सकता है जहां मूल चर को संरक्षित नहीं किया जाना चाहिए। मूल चर (जैसे प्रतिलिपि) को संरक्षित करना इस कदम को अमान्य नहीं करता है। – Bernard

+0

संबंधित/डुप्ली: https://stackoverflow.com/questions/33939644/understanding-stdis-move-constructible – NathanOliver

+0

बर्नार्ड की टिप्पणी में थोड़ा और विवरण जोड़ने के लिए: एक चाल के बाद, स्रोत चर को खाली होने की गारंटी नहीं है। (कुछ वस्तुओं में "खाली" की अवधारणा भी नहीं हो सकती है।) यह * खाली हो सकता है, निश्चित रूप से, या यह अपरिवर्तित हो सकता है, या यह पूरी तरह से कुछ और हो सकता है उदा। अब यह वैल्यू हो सकता है जो पहले लक्ष्य चर (असाइनमेंट के मामले में) में था।Std :: स्ट्रिंग के मामले में, यह अक्सर खाली होता है यदि यह चाल से पहले एक लंबी स्ट्रिंग थी, और यदि यह एक छोटी स्ट्रिंग थी तो अपरिवर्तित। –

उत्तर

31

यह कि इस कदम निर्माता का प्रतीक है और काम समारोह के लिए कदम परोक्ष संकलक

हाँ यह सही है द्वारा परिभाषित नहीं किया जा सकता।

और इसलिए चालन की अनुमति नहीं है।

नहीं है, इस कदम के संचालन अभी भी प्रति निर्माता के माध्यम से प्रदर्शन किया जा सकता है और कॉपी असाइनमेंट ऑपरेटर (हालांकि इस मामले आप की उम्मीद नहीं किया जा सकता है), क्योंकि एक rvalue हमेशा const& करने के लिए बाध्य किया जा सकता है।

अधिक सटीक, कक्षा copyable अभी भी MoveConstructible और MoveAssignable है। एक प्रति निर्माता है कि एक स्थिरांक टी & तर्क लेता rvalue भाव बाध्य कर सकते हैं:

एक वर्ग इस प्रकार आवश्यकता को पूरा करने के लिए एक कदम निर्माता को लागू करने की जरूरत नहीं है।

यदि कोई मूव कॉन्स्ट्रक्टेबल क्लास एक चालक कन्स्ट्रक्टर लागू करता है, तो यह इस तथ्य का लाभ उठाने के लिए चाल अर्थशास्त्र को भी कार्यान्वित कर सकता है कि निर्माण के बाद आरवी का मूल्य निर्दिष्ट नहीं है।

और

प्रकार क्रम इस प्रकार आवश्यकता को पूरा करने में कदम असाइनमेंट ऑपरेटर को लागू करने की जरूरत नहीं है: एक प्रति असाइनमेंट ऑपरेटर कि मूल्य द्वारा या एक स्थिरांक प्रकार & के रूप में अपनी पैरामीटर लेता है, बाँध होगा बहस तर्क के लिए।

यदि कोई मूव एसिग्नेबल क्लास एक चाल असाइनमेंट ऑपरेटर लागू करता है, तो यह इस तथ्य का लाभ उठाने के लिए चाल अर्थशास्त्र को भी कार्यान्वित कर सकता है कि असाइनमेंट के बाद आरवी का मान निर्दिष्ट नहीं है।

रूप @Curious कहा, आप इस कदम निर्माता घोषित करने और असाइनमेंट ऑपरेटर delete लिए कदम स्पष्ट रूप से copyable unmovable बनाने के लिए कर सकते हैं; फिर एक rvalue अभिव्यक्ति के साथ उपयोग delete एड अधिभार का चयन किया जाएगा और संकलन विफल हो जाएगा।

+5

मुझे लगता है कि यह स्पष्ट करने के लायक है कि चालक कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर को स्पष्ट रूप से हटाने से – Curious

+2

@ क्रिएटिव जोड़ा जाएगा। – songyuanyao

+3

लेकिन हटाए गए कदम सदस्यों को गैर-हटाए गए प्रतिलिपि सदस्यों के साथ संयुक्त किया जाता है, लगभग हमेशा एक तार्किक त्रुटि होती है, क्योंकि कक्षा 'CopyConstructible' और' CopyAssignable' आवश्यकताओं को पूरा करने में विफल रहता है (जिसके लिए राजस्व से प्रतिलिपि की आवश्यकता होती है)। यह, उदाहरण के लिए, किसी फैक्ट्री फ़ंक्शन से मूल्य के आधार पर स्थानीय अंतराल को वापस करने की अनुमति देगा। दिशानिर्देश: कभी भी चाल सदस्यों को हटाएं: https://stackoverflow.com/a/38820178/576911 –

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

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