2015-03-10 5 views
6

प्रति this presentation, यदि प्रतिलिपि निर्माता या कॉपी असाइनमेंट ऑपरेटर "उपयोगकर्ता घोषित" है, तो कोई अंतर्निहित चाल संचालन उत्पन्न नहीं होगा। क्या delete कॉपी कन्स्ट्रक्टर या कॉपी असाइनमेंट ऑपरेटर गिनती "उपयोगकर्ता घोषित" के रूप में है?क्या एक कॉपी कन्स्ट्रक्टर या कॉपी असाइनमेंट ऑपरेटर को "उपयोगकर्ता घोषित" के रूप में कॉपी करता है?

struct NoCopy { 
    NoCopy(NoCopy&) = delete; 
    NoCopy& operator=(const NoCopy&) = delete; 
}; 

क्या NoCopy कक्षा के लिए अंतर्निहित चाल संचालन उत्पन्न किए जाएंगे? या संबंधित प्रतिलिपि संचालन को "उपयोगकर्ता घोषित" के रूप में गिनती है और इस प्रकार निहित गति उत्पादन को रोकता है?

यदि संभव हो, तो मैं मानक के प्रासंगिक हिस्सों का संदर्भ देने वाला उत्तर पसंद करूंगा।

उत्तर

6

आपकी प्रस्तुति की स्लाइड 14 के अनुसार, एक हटाई गई प्रतिलिपि निर्माता "उपयोगकर्ता घोषित" है, इस प्रकार चालन को अवरुद्ध कर रहा है।

+0

अच्छा ... मुझे पूरी तरह से जागने से पहले सी ++ के बारे में पढ़ने की कोशिश करने के लिए यही मिलता है। यह बात बताने के लिए धन्यवाद। – acm

8

शब्द "उपयोगकर्ता घोषित" शब्द में औपचारिक परिभाषा नहीं है। यह विशेष सदस्य कार्यों के संदर्भ में "निहित रूप से घोषित" के विपरीत होना है। [Dcl.fct.def.default]/4 इस तथ्य के बारे में थोड़ा साफ हो सकता है, लेकिन इरादा नहीं है:

स्पष्ट रूप-डिफॉल्ट कार्य करता है और परोक्ष-घोषित कार्यों सामूहिक रूप से कहा जाता है चूक काम करता है, और कार्यान्वयन उनके लिए निहित परिभाषा प्रदान करेगा (12.1 12.4, 12.8), जिसका अर्थ है उन्हें हटाए गए रूप में परिभाषित करना। एक विशेष सदस्य समारोह उपयोगकर्ता द्वारा प्रदत्त है यदि यह उपयोगकर्ता द्वारा घोषित किया गया है और इसकी पहली घोषणा पर स्पष्ट रूप से डिफ़ॉल्ट या हटाया गया नहीं है। एक उपयोगकर्ता द्वारा प्रदान की गई स्पष्ट रूप से डिफॉल्ट फ़ंक्शन (यानी, इसकी पहली घोषणा के बाद स्पष्ट रूप से डिफॉल्ट) उस बिंदु पर परिभाषित किया गया है जहां इसे स्पष्ट रूप से डिफॉल्ट किया गया है; यदि इस तरह के एक समारोह को हटाए गए रूप में परिभाषित किया गया है, तो कार्यक्रम खराब हो गया है।

NoCopy(NoCopy&) = delete; और NoCopy& operator=(const NoCopy&) = delete; दोनों विशेष सदस्य कार्यों की घोषणाएं हैं। चूंकि आप स्पष्ट रूप से उन्हें घोषित कर रहे हैं, क्योंकि संकलक को उन्हें स्पष्ट रूप से घोषित करने की अनुमति देने के विरोध में, वे उपयोगकर्ता द्वारा घोषित किए गए हैं। उन घोषणाओं इसलिए इस कदम निर्माता के अंतर्निहित घोषणाओं को दबाने और [class.copy]/9 प्रति असाइनमेंट ऑपरेटर पर आ जाएगा:

एक वर्ग X की परिभाषा को स्पष्ट रूप से एक कदम निर्माता की घोषणा नहीं करता है, एक परोक्ष हो जाएगा घोषित करता है, तो चूक और केवल यदि

के रूप में - X एक उपयोगकर्ता के घोषित प्रतिलिपि निर्माता नहीं है,

- X एक उपयोगकर्ता के घोषित प्रति असाइनमेंट ऑपरेटर नहीं है,

- X एक उपयोगकर्ता के घोषित चाल असाइनमेंट ऑपरेटर नहीं है,

- X एक उपयोगकर्ता के घोषित नाशक नहीं है, और

- के रूप में नष्ट चाल निर्माता परोक्ष रूप से परिभाषित नहीं किया जाएगा।

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

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