2010-04-22 17 views
6

व्युत्पन्न कक्षाओं के लिए डिफ़ॉल्ट चालक कन्स्ट्रक्टर या असाइनमेंट ऑपरेटर क्यों नहीं बनाया गया है? मेरा मतलब क्या है इसका प्रदर्शन करना; इस सेटअप कोड होने:कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर ले जाएं: क्यों व्युत्पन्न कक्षाओं के लिए कोई डिफ़ॉल्ट नहीं है?

#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 के साथ बाद में परीक्षण ने वही व्यवहार दिखाया।

+1

क्या 'std :: move' यहां कुछ भी बदलता है? 'ए()' पहले से ही एक रावल नहीं है? –

+0

हां, यह करता है। अन्यथा सी ++ मानक कंपाइलर को केवल-निर्माण-एक्स में संपीड़ित करने की अनुमति देता है (या इसलिए मुझे freenode.net पर बताया गया था)। मैंने यह भी सत्यापित किया कि बिना 'std :: move' के चालक कन्स्ट्रक्टर को बाधित नहीं किया जाता है, इसलिए freenode.net की टिप्पणी सत्य प्रतीत होती है। – doublep

+2

@ माइक: कॉपी एलिजन (12.8/34, 0x एफसीडी) एक सामान्य अनुकूलन है, लेकिन चाल() का उपयोग करके यह अभिव्यक्ति अनुमत परिस्थितियों के बाहर आती है। –

उत्तर

6

0x एफसीडी (12.8/17 विशेष रूप से चाल सीटीआर के लिए) में 12.8 के माध्यम से पढ़ना, यह एक जीसीसी बग प्रतीत होता है। जैसा कि आप 4.4 में करते हैं, वही चीज 4.5 में हो रही है।

मुझे हटाए गए कार्यों, या कुछ समान पर एक कोने केस गुम हो सकता है, लेकिन मुझे अभी तक इसका कोई संकेत नहीं दिख रहा है।

+0

बस 4.5 के साथ परीक्षण किया, मुझे एक ही परिणाम मिलते हैं। क्या आप किसी अन्य कंपाइलर पर परीक्षण कर सकते हैं? (यह देखते हुए कि सी ++ 0x किसी भी तरह से समाप्त नहीं हुआ है, यह एक बग नहीं बल्कि बदले में एक पुराना व्यवहार हो सकता है।) – doublep

+3

12.8 (एन 3053 में उत्पन्न) में सामान का एक गुच्छा 'gcc' में समर्थित नहीं है फिर भी, उनके [सी ++ 0x समर्थन पृष्ठ] के अनुसार (http://gcc.gnu.org/projects/cxx0x.html) - क्या यह समस्या हो सकती है? –

+0

@ माइक: ऐसा लगता है, हाँ। –

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

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