2015-10-13 9 views
8

अपवाद पर किसी ऑब्जेक्ट के स्थिर प्रकार का उपयोग फेंक दिया गया ऑब्जेक्ट कॉपी करें। उदाहरण के लिए:क्यों वस्तुओं को फेंकना चाहिए-प्रारंभिक?

struct foo 
{ 
    foo() = default; 
    foo(const foo&) = delete; 
}; 

int main() 
{ 
    throw foo(); 
} 

Clang++ --std=c++14 शिकायत है कि स्पष्ट रूप से हटाए प्रतिलिपि निर्माता नहीं किया जा सकता। इसके बजाय इसे क्यों शुरू नहीं किया जा सकता है?

+0

मैं अब इसे हटा नहीं सकता क्योंकि इसका जवाब है लेकिन मैं "सरल टाइपोग्राफ़िक त्रुटि" के कारण ऑफ़-विषय के रूप में बंद करने के लिए मतदान कर रहा हूं। मेरी समस्या इस के रूप में तुच्छ नहीं थी, लेकिन मैं स्पष्ट रूप से एक चालक कन्स्ट्रक्टर बनाने के लिए भूल गया था। – zneak

+0

आपके प्रश्न के लिए धन्यवाद मैंने कुछ सीखा है। कृपया इसे बंद करने के लिए वोट न दें, और किसी भी तरह से इसे हटाएं नहीं !! –

उत्तर

9

इसे स्थानांतरित नहीं किया जा सकता है क्योंकि इस प्रकार के कोई चालक नहीं है। एक हटाए गए प्रतिलिपि निर्माता निहित चाल कन्स्ट्रक्टर को दबा देता है।

4

क्योंकि foo(foo&&); गुम है। delete द्वारा कॉपी कन्स्ट्रक्टर में आपने कन्स्ट्रक्टर को भी दबाया है।

+0

चालक कन्स्ट्रक्टर हटाया नहीं गया है, बस अनुपस्थित है। –

+0

@ जोनाथन वाकई 'हटाया नहीं गया है, बस गायब है'? कॉपी कन्स्ट्रक्टर को हटाने से कन्स्ट्रक्टर को – SergeyA

+0

@ जोनाथन वाकई: "हटाए गए" की दो अलग-अलग इंद्रियों को हटा दिया जाता है। मुझे लगता है कि बेहतर हो सकता है कि कोई क्या कर सकता है और नहीं कर सकता। जैसे एक चालक कन्स्ट्रक्टर को परिभाषित करना। –

6

निम्न के कोड को संशोधित करें:

struct foo 
{ 
    foo() = default; 
    foo(const foo&) = delete; 
    foo(foo&&) = default; 
}; 

int main() 
{ 
    throw foo(); 
} 

पढ़ें this, अनुभाग "उलझाव-घोषित चाल निर्माता"।

3

मानक से लागू शब्दों (§ [class.copy]/9) इस तरह मोटे तौर पर लग रहा है (ठीक है, वास्तव में इस तरह, N4296 के रूप में):

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

  • एक्स एक उपयोगकर्ता के घोषित प्रतिलिपि ctor नहीं है,

[...]

यह लागू होता है क्योंकि कॉपी सीटीओ को हटाए जाने के रूप में परिभाषित करने का मतलब है कि आपने कॉपी सीटीआर घोषित कर दिया है।

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