2012-02-12 7 views
13

मैं इस संबंध में कुछ विरोधाभासी लेख पढ़ रहा हूं कि क्या चालक/असाइनमेंट को फेंकने की अनुमति है या नहीं।क्या चालक रचनाकारों को अव्यवस्थित होना आवश्यक है?

इसलिए मैं पूछना चाहता हूं कि अंतिम सी ++ 11 मानक में फेंकने वाले कन्स्ट्रक्टर/असाइनमेंट को फेंकने की अनुमति है या नहीं?

+0

मुझे मानक कन्स्ट्रक्टरों को फेंकने की अनुमति नहीं देने के बारे में मानक में कुछ भी नहीं देखा, लेकिन मैंने देखा कि "कक्षा एक्स के लिए निहित रूप से घोषित चालक कन्स्ट्रक्टर के पास 'एक्स :: एक्स (एक्स एंड amp)' ", और मुझे वहां 'अस्वीकरण' नहीं दिखाई देता है। –

+0

अंतिम मसौदे में, मुझे किसी भी फ़ंक्शन के लिए 'अस्वीकरण' घोषित नहीं किया गया है ... – ronag

+0

@ronag: क्या आप वाकई देख रहे हैं? क्योंकि मैंने N3337 खोला और अभी "'noexcept'" की खोज की और तत्काल कुछ वर्ग के' स्वैप 'फ़ंक्शन को मिला। –

उत्तर

17

क्या चालकों को सामान्य रूप से फेंकने की अनुमति है? हाँ। वे चाहिए? सं।

आम तौर पर, आप उनके भीतर कुछ भी नहीं करना चाहिए जो फेंक सकता है। आपको स्मृति आवंटित नहीं करना चाहिए, अन्य कोड को कॉल करना, या ऐसा कुछ भी नहीं होना चाहिए। एक चालक कन्स्ट्रक्टर लिखने का एकमात्र कारण किसी और के मेमोरी पॉइंटर्स और ऑब्जेक्ट रेफरेंस के साथ फरार करना है। आपको कुछ मूल प्रकारों की प्रतिलिपि बनाना चाहिए और अन्य ऑब्जेक्ट में मानों को कम करना चाहिए। उन चीजों को फेंकना नहीं चाहिए।

तो इसकी अनुमति होने पर, यह एक अच्छा विचार नहीं है। यदि आप इसे कर रहे हैं, तो अपने कदम संचालन में आप क्या कर रहे हैं पर पुनर्विचार करें।

+0

मुझे लगता है कि चालक कन्स्ट्रक्टर में कोई एसएलएल प्रकार फेंक नहीं है? मुझे इसके बारे में चिंता करने वाली एकमात्र जगह अमरीकी डालर के साथ है? – ronag

+6

@ronag: यदि std :: प्रकार के अपने चालक कन्स्ट्रक्टर पर 'अस्वीकरण' नहीं है, तो इसे फेंकने की अनुमति है। विशेष रूप से, नोड-आधारित कंटेनरों के कुछ कार्यान्वयन में फेंकने वाला चालक होता है क्योंकि प्रत्येक कंटेनर में एक ढेर-आवंटित अंत-नोड, यहां तक ​​कि खाली कंटेनर भी होना चाहिए। इन समान कंटेनरों के अन्य कार्यान्वयन में यह डिज़ाइन नहीं है और इसलिए (और अनुमति दी जा सकती है) में एक अव्यवस्थित चालक है। –

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