2013-09-06 3 views
40

ऐसा लगता है कि एक वेक्टर जांच करेगा कि क्या चालक को पुन: आवंटित करते समय तत्वों को स्थानांतरित करने या प्रतिलिपि बनाने के निर्णय लेने से पहले अस्वीकार्य के रूप में लेबल किया गया है या नहीं। डिफ़ॉल्ट चालक कन्स्ट्रक्टर को अस्वीकार्य के रूप में परिभाषित किया गया है? मैंने निम्नलिखित दस्तावेज देखा लेकिन यह इसे निर्दिष्ट नहीं किया। http://en.cppreference.com/w/cpp/language/move_constructorडिफ़ॉल्ट मूव कन्स्ट्रक्टर को अस्वीकार्य के रूप में परिभाषित किया गया है?

उलझाव-घोषित चाल निर्माता

कोई उपयोगकर्ता परिभाषित कदम कंस्ट्रक्टर्स एक वर्ग प्रकार (struct, वर्ग या संघ), के लिए प्रदान की जाती हैं और निम्न में से सभी सत्य है, तो: देखते हैं कोई उपयोगकर्ता द्वारा घोषित प्रति रचनाकार कोई उपयोगकर्ता द्वारा घोषित प्रति असाइनमेंट ऑपरेटर कोई उपयोगकर्ता द्वारा घोषित चाल असाइनमेंट ऑपरेटर नहीं हैं उपयोगकर्ता द्वारा घोषित विनाशक निहित घोषित चालक विस्तृत शर्तों के कारण हटाए गए अनुसार परिभाषित नहीं हैं अगले खंडमेंतब संकलक एक इनलाइन सार्वजनिक हस्ताक्षर टी :: टी (टी & &) के साथ एक वर्ग के सदस्य के रूप में एक चालक कन्स्ट्रक्टर घोषित करेगा) एक कक्षा में एकाधिक चालक रचनाकार हो सकते हैं, उदा। टी टी टी (कॉन्स टी & &) और टी :: टी (टी & &) दोनों। यदि कुछ उपयोगकर्ता परिभाषित चाल निर्माता मौजूद हैं, तो उपयोगकर्ता कीवर्ड डिफ़ॉल्ट के के साथ निहित रूप से घोषित चालक निर्माता की पीढ़ी को मजबूर कर सकता है।

उत्तर

48

मुझे लगता है कि इस सवाल का जवाब 15.4/14 (अपवाद विनिर्देशों) है:

एक विरासत में निर्माता (12.9) और एक परोक्ष विशेष सदस्य समारोह (खंड 12) की घोषणा की एक अपवाद-विनिर्देश है। यदि f एक इनहेरिट निर्माता या एक परोक्ष घोषित डिफ़ॉल्ट निर्माता, है निर्माता, चाल निर्माता, नाशक कॉपी, असाइनमेंट ऑपरेटर कॉपी, या असाइनमेंट ऑपरेटर ले जाते हैं, अपने निहित अपवाद-विनिर्देश प्रकार आईडी T यदि और केवल यदि T निर्दिष्ट करता है अपवाद-विनिर्देश द्वारा सीधे फ़ंक्शन के f की अंतर्निहित परिभाषा द्वारा अनुमत किए जाने की अनुमति है; f सभी अपवादों को अनुमति देता है यदि कोई भी फ़ंक्शन सीधे इनकार करता है तो सभी अपवादों को अनुमति देता है, और f में अपवाद-विनिर्देशnoexcept(true) है यदि प्रत्येक फ़ंक्शन इसे सीधे आमंत्रित करता है तो कोई अपवाद नहीं देता है।

असल में, यह वही करता है जो आप सोचते हैं, और निहित रूप से घोषित चाल निर्माता noexcept जब भी हो सकता है।

+29

अतिरिक्त जानकारी: और आप परीक्षण कर सकते हैं या नहीं, अपनी उम्मीदों पूरा किया गया है: 'static_assert (std :: is_nothrow_move_constructible :: मूल्य," MyType MoveConstructible noexcept होना चाहिए ");' –

+0

तो सभी कार्यों निहित विशेष द्वारा लाया निहित विशेष सदस्य कार्यों के लिए 'अस्वीकरण' होने के लिए सदस्य कार्यों को 'अस्वीकरण' घोषित किया जाना चाहिए। मतलब है कि आपको सभी प्रासंगिक कार्यों 'नोएक्ससेप्ट' को चिह्नित करने के लिए पर्याप्त मेहनत करनी है, इसका मतलब है कि मानव त्रुटि के लिए बहुत कुछ जगह है, है ना? – mucaho

+1

@ मुकाहो: ठीक है, अगर आपके सभी सदस्य स्वयं केवल स्पष्ट रूप से परिभाषित विशेष सदस्यों का उपयोग करते हैं, तो यह सब जटिल नहीं है। सरल नियम एकल जिम्मेदारी का नियम है, और डिफ़ॉल्ट रूप से केवल एकमात्र मानवीय त्रुटि जिसे आप देखना चाहिए, विशेष सदस्य कार्यों को स्पष्ट रूप से परिभाषित करना है।यह केवल विशेष उद्देश्य वर्गों (जैसे कि 'unique_ptr') छोड़ देता है जिसे आपको पशु चिकित्सक की आवश्यकता होती है। –

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