2012-04-18 13 views
8

निम्नलिखित कोड का टुकड़ा प्रति निर्माता के नाम से जाना मैं कहाँ की उम्मीद चाल निर्माता के नाम से जाना कारण बनता है:,इस प्रतिलिपि निर्माता को चालक कन्स्ट्रक्टर के बजाय क्यों कहा जाता है?

#include <cstdio> 

struct Foo 
{ 
    Foo() { puts("Foo gets built!"); } 
    Foo(const Foo& foo) { puts("Foo gets copied!"); } 
    Foo(Foo&& foo) { puts("Foo gets moved!"); } 
}; 

struct Bar { Foo foo; }; 
Bar Meow() { Bar bar; return bar; } 
int main() { Bar bar(Meow()); } 

VS11 बीटा पर डिबग मोड में, इस प्रिंट:

Foo gets built! 
Foo gets copied! 
Foo gets copied! 

मैं जाँच मानक और Bar एक डिफ़ॉल्ट चालक कन्स्ट्रक्टर स्वचालित रूप से जेनरेट करने के लिए सभी आवश्यकताओं को पूरा करने लगता है, फिर भी ऐसा प्रतीत नहीं होता है जब तक कोई अन्य कारण नहीं है कि ऑब्जेक्ट को स्थानांतरित नहीं किया जा सकता है। मैंने बहुत सारे कदमों को देखा है और यहां कन्स्ट्रक्टर से संबंधित प्रश्नों की प्रतिलिपि बनाई है लेकिन मुझे नहीं लगता कि किसी के पास यह विशिष्ट मुद्दा है।

यहां क्या हो रहा है पर कोई संकेतक? क्या यह मानक व्यवहार है?

+0

क्या 'std :: move (bar) वापस लौटाता है; 'कुछ भी बदलें? बीटीडब्ल्यू, जीसीसी 4.7.0 ने चालक कन्स्ट्रक्टर को कॉल किया (कॉपी एलिशन बंद कर दिया गया)। –

+0

बीटीडब्ल्यू, जीसीसी 4.6.1 या तो प्रतिलिपि या सीटीओआर को कॉल नहीं करता है। –

+0

जी ++ 4.5.3 केवल ऑब्जेक्ट बनाता है: "फू बन जाता है!" (प्रतिलिपि प्रतिलिपि), जबकि प्रतिलिपि elision अक्षम के साथ यह वस्तु दो बार प्रतिलिपि बनाता है। क्या एक चालक कन्स्ट्रक्टर नहीं है जिसे केवल एक रावल्यू कहा जाता है? मुझे पूरा यकीन नहीं है कि मेव() योग्यता प्राप्त करता है। –

उत्तर

8

दुर्भाग्य से, वीएस 11 डिफ़ॉल्ट चालक कन्स्ट्रक्टर प्रदान नहीं करता है। टिप्पणी अनुभाग में Move Semantics देखें - उद्धृत करने के लिए:

डिफ़ॉल्ट प्रतिलिपि निर्माता के विपरीत, संकलक एक डिफ़ॉल्ट चाल निर्माता प्रदान नहीं करता है।

+0

अच्छा पकड़, धन्यवाद! क्या किसी भी तरह से मानक द्वारा अनुमति दी गई है? यदि मुझे नहीं लगता कि मैं माइक्रोसॉफ्ट कनेक्ट पर एक बग खोलूंगा, भले ही उन्हें इसके बारे में अच्छी तरह से अवगत होना चाहिए। – Trillian

+0

एमएस ने अभी तक सभी नई सी ++ 11 सुविधाओं को लागू नहीं किया है। Http://msdn.microsoft.com/en-us/library/hh409293%28v=vs.110%29.aspx और http://blogs.msdn.com/b/vcblog/archive/2011/ पर और जानकारी है 09/12/1020 9 2 9 1.aspx – Fraser

+0

अरे, हमें अंतिम वीएस 11 रिलीज के लिए डिफॉल्ट मूव कन्स्ट्रक्टर पीढ़ी भी नहीं मिल रही है: / – Trillian

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