व्युत्पन्न कक्षाओं के लिए डिफ़ॉल्ट चालक कन्स्ट्रक्टर या असाइनमेंट ऑपरेटर क्यों नहीं बनाया गया है? मेरा मतलब क्या है इसका प्रदर्शन करना; इस सेटअप कोड होने:कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर ले जाएं: क्यों व्युत्पन्न कक्षाओं के लिए कोई डिफ़ॉल्ट नहीं है?
#include <utility>
struct A
{
A() { }
A (A&&) { throw 0; }
A& operator= (A&&) { throw 0; }
};
struct B : A
{ };
निम्नलिखित लाइनों के
या तो फेंकता है:
A x (std::move (A());
A x; x = A();
लेकिन निम्नलिखित में से कोई भी कार्य करता है:
B x (std::move (B());
B x; x = B();
मामले यह मायने रखता है में, मैं जीसीसी 4.4 के साथ परीक्षण किया ।
संपादित करें: जीसीसी 4.5 के साथ बाद में परीक्षण ने वही व्यवहार दिखाया।
क्या 'std :: move' यहां कुछ भी बदलता है? 'ए()' पहले से ही एक रावल नहीं है? –
हां, यह करता है। अन्यथा सी ++ मानक कंपाइलर को केवल-निर्माण-एक्स में संपीड़ित करने की अनुमति देता है (या इसलिए मुझे freenode.net पर बताया गया था)। मैंने यह भी सत्यापित किया कि बिना 'std :: move' के चालक कन्स्ट्रक्टर को बाधित नहीं किया जाता है, इसलिए freenode.net की टिप्पणी सत्य प्रतीत होती है। – doublep
@ माइक: कॉपी एलिजन (12.8/34, 0x एफसीडी) एक सामान्य अनुकूलन है, लेकिन चाल() का उपयोग करके यह अभिव्यक्ति अनुमत परिस्थितियों के बाहर आती है। –