Friday 15 July 2011

c++ - Danger with virtual base move assignment operators when they are now allowed to be used? -


यह C ++ के समाधान का समाधान करता है I सारांश:

  टेम्पलेट & lt; typename T & gt; संरचना लपेटो {लपेट () = डिफ़ॉल्ट; लपेटो (लपेटो & amp;) = डिफ़ॉल्ट; लपेटें (कॉस्ट लपेटो & amp;) = डिफ़ॉल्ट; टी टी; }; स्ट्रेट एस एस (एस) {} एस (कॉन्स्ट एस एंड amp) {} एस (एस एंड amp;) {}}; टाइप-फेफ रैप & lt; const S & gt; डब्ल्यू; // त्रुटि, "लपेटें और लेफ्टिनेंट; कॉन्स्ट S & gt;" का डिफ़ॉल्ट कंसोल हटा दिया गया है! डब्ल्यू मिल () {वापसी डब्ल्यू (); }    

(मुद्दा यह है कि हम इस स्निपेट के लिए एक त्रुटि प्राप्त कर रहे हैं, भले ही कंपाइलर बस "एस" की प्रतिलिपि कन्स्ट्रक्टर का उपयोग कर सके, जैसा कि ऐसा करता है उपयोगकर्ता स्पष्ट रूप से "रैप" के चालन कन्स्ट्रक्टर को लिखता है। अधिलेखित प्रस्तावों के दौरान हटाए गए चालन निर्माता (और असाइनमेंट ऑपरेटर) को अनदेखा करने के लिए समस्या का समाधान किया गया था, इसलिए वांछित रूप से उपरोक्त प्रतिलिपि निर्माता का उपयोग करना।)

इस रिज़ॉल्यूशन:

प्रतिलिपि के निहित / डिफ़ॉल्ट चाल ऑपरेशन के लिए कोई अतिरिक्त प्रतिबंध नहीं है। इसका अर्थ है कि आभासी आधार में कदम असाइन करना खतरनाक है (और संकलक को शायद चेतावनी देना चाहिए) [...] लेकिन हमने बैतविया में निर्णय लिया है कि हम सभी सी ++ 03 कोड को अन्तर्निहित कदम परिचालनों के खिलाफ नहीं बनाएंगे, और मुझे लगता है यह प्रस्ताव महत्वपूर्ण प्रदर्शन लाभ प्रदान करता है।

क्या कोई कृपया वर्णन कर सकता है कि आभासी आधार चाल असाइनमेंट ऑपरेटरों के साथ क्या चिंता है?

विचार करें: <पूर्व> #include & lt; iostream & gt; संरचना ए {ए () = डिफ़ॉल्ट; ए (कॉन्स्ट ए & amp;) = डिफ़ॉल्ट; ए (ए और amp;) = डिफ़ॉल्ट; & Amp; ऑपरेटर = (कॉन्स्ट ए & amp;) {std :: cout & lt; & lt; "ऑपरेटर = (कॉन्स्ट A & amp;) \ n"; वापसी * ​​यह;} ए & amp; ऑपरेटर = (ए और amp;) {std :: cout & lt; & lt; "ऑपरेटर = (& amp; & amp;) \ n"; वापसी * ​​यह;}}; Struct बी: आभासी जनता ए {}; Struct सी: आभासी जनता ए {}; संरचना डी: सार्वजनिक बी, सार्वजनिक सी {}; Int main () {डी डी 1, डी 2; D1 = std :: कदम (डी 2); }

मेरा मानना ​​है कि इस प्रोग्राम को आउटपुट चाहिए:

  ऑपरेटर = (ए और amp;) ऑपरेटर = (ए एंड amp;)  < / प्री> 

मेरे लिए यह वास्तव में आउटपुट करता है:

  ऑपरेटर = (कॉन्स्ट ए और ऑपरेटर = (कॉन्स्ट ए और)   

लेकिन मुझे लगता है यह सिर्फ एक क्लैग बग है (-std = c ++ 1y के साथ संकलित) यदि मैं सही हूँ कि आउटपुट किस प्रकार होना चाहिए, तो खतरे यह है कि स्थानांतरण असाइनमेंट ऑपरेटर को दो बार कहा जाता है यह प्रतिलिपि असाइनमेंट ऑपरेटर के साथ हानिरहित (हालांकि संभावित महंगा) है, लेकिन चाल असाइनमेंट ऑपरेटर के साथ नहीं।

No comments:

Post a Comment