2015-11-03 8 views
6

मैं एक नष्ट कर दिया नाशक के साथ एक वर्ग है अंतर्निहित उपयोग:नाशक

struct indestructible { 
    indestructible(indestructible&&); 
    ~indestructible() = delete; 
}; 

जब मैं उसके स्थानांतरण निर्माता इस्तेमाल करने की कोशिश, संकलक शिकायत:

struct user { 
    indestructible ind; 
    user(indestructible&& ind) : ind(std::move(ind)) {} 
}; 

indestructible.cc:11:3: error: attempt to use a deleted function 
user(indestructible&& ind) : ind(std::move(ind)) {} 
^ 
indestructible.cc:6:3: note: '~indestructible' has been explicitly marked deleted here 
    ~indestructible() = delete; 

क्या चल रहा है? ऐसे कोई अन्य सदस्य नहीं हैं जो फेंक सकते हैं, और न ही कन्स्ट्रक्टर बॉडी करता है, तो चालक को धमकाने के लिए चालक के लिए कोई कारण क्यों है?

+5

यदि 'अविनाशी' को नष्ट नहीं किया जा सकता है, तो इसमें कोई ऑब्जेक्ट कैसे नष्ट हो सकता है? –

+2

ध्यान दें कि 'उपयोगकर्ता' का विनाशक अभी भी हटाए गए विनाशक की तुलना में 'ind' – JSQuareD

+0

ए (थोड़ा) बेहतर समाधान को नष्ट करने का प्रयास करेगा, संरक्षित या निजी विनाशक हो सकता है, और उपयोगकर्ता को प्राप्त या मित्र होना चाहिए। वैकल्पिक रूप से आप ऑब्जेक्ट को डिज़ाइन कर सकते हैं ताकि वास्तव में यह एक सामान्य विनाशक हो और विशेष रूप से –

उत्तर

3

[class.base.init]/12:

एक गैर सौंपने के निर्माता, प्रत्येक प्रत्यक्ष या आभासी आधार वर्ग के लिए और वर्ग प्रकार से प्रत्येक गैर स्थैतिक डेटा सदस्य के लिए नाशक संभावित शुरू हो जाती है (12.4)। [नोट: यह प्रावधान सुनिश्चित करता है कि अपवाद फेंकने के मामले में विनाशकों को पूरी तरह से निर्मित उप-ऑब्जेक्ट्स के लिए बुलाया जा सकता है (15.2)। - अंत टिप्पणी]

[class.dtor]/11:

एक कार्यक्रम बीमार बनाई है एक नाशक है कि संभावित शुरू हो जाती है नष्ट कर दिया या मंगलाचरण के संदर्भ से सुलभ नहीं है यदि।

ऐसे निर्माता के लिए कोई अपवाद नहीं किया गया है जो फेंक नहीं देता है। CWG 1915 भी देखें।

+0

धन्यवाद। ऐसा लगता है कि यह मेरे लिए संघ का समय है। –

7

जब आपकी user वस्तु दायरे से बाहर हो जाती है, तो यह नष्ट हो जाती है। इसके सदस्यों को indestructible सदस्य समेत नष्ट कर दिया गया है, और यह असंभव है क्योंकि इसके विनाशक को हटा दिया गया है।

+2

मेरे उदाहरण में, उपयोगकर्ता ऑब्जेक्ट कभी भी किसी भी दायरे से बाहर नहीं निकलता है। विचार करें: 'ऑटो उपयोगकर्ता = नया उपयोगकर्ता (std :: move (* नया अविनाशी));' इसलिए 'उपयोगकर्ता का विनाशक कभी नहीं कहा जाता है। कंपाइलर त्रुटि संदेश के संदर्भ पर भी विचार करें - यह 'उपयोगकर्ता' का चालक है। इसे विनाशक को तत्काल क्यों करना है? –

+0

चूंकि किसी ऑब्जेक्ट को "चलाना" का अर्थ यह नहीं है कि ऑब्जेक्ट समाप्त हो गया है। 'ऑटो ए = std :: move (बी);' बी' को नष्ट नहीं करता है। यह उस चालक पर निर्भर है जो चालक को कार्यान्वित करता है जिसमें यह बताया गया है।कंपाइलर के लिए, 'बी' का जीवनकाल तब समाप्त होता है जब' बी' गुंजाइश से बाहर हो जाता है। – JohnB

+0

इसके अतिरिक्त, ': ind (std :: move (ind)) 'पैरामीटर' इंडेक्स पर काम करता है, जो एक चर है और इस प्रकार आपके चालक कन्स्ट्रक्टर के अंत में गुंजाइश से बाहर हो जाता है। इसलिए आपको समस्याओं में भाग लेने के लिए 'उपयोगकर्ता' को भी नष्ट करने की आवश्यकता नहीं है। – JohnB

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