निम्नलिखित कोड का टुकड़ा प्रति निर्माता के नाम से जाना मैं कहाँ की उम्मीद चाल निर्माता के नाम से जाना कारण बनता है:,इस प्रतिलिपि निर्माता को चालक कन्स्ट्रक्टर के बजाय क्यों कहा जाता है?
#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
एक डिफ़ॉल्ट चालक कन्स्ट्रक्टर स्वचालित रूप से जेनरेट करने के लिए सभी आवश्यकताओं को पूरा करने लगता है, फिर भी ऐसा प्रतीत नहीं होता है जब तक कोई अन्य कारण नहीं है कि ऑब्जेक्ट को स्थानांतरित नहीं किया जा सकता है। मैंने बहुत सारे कदमों को देखा है और यहां कन्स्ट्रक्टर से संबंधित प्रश्नों की प्रतिलिपि बनाई है लेकिन मुझे नहीं लगता कि किसी के पास यह विशिष्ट मुद्दा है।
यहां क्या हो रहा है पर कोई संकेतक? क्या यह मानक व्यवहार है?
क्या 'std :: move (bar) वापस लौटाता है; 'कुछ भी बदलें? बीटीडब्ल्यू, जीसीसी 4.7.0 ने चालक कन्स्ट्रक्टर को कॉल किया (कॉपी एलिशन बंद कर दिया गया)। –
बीटीडब्ल्यू, जीसीसी 4.6.1 या तो प्रतिलिपि या सीटीओआर को कॉल नहीं करता है। –
जी ++ 4.5.3 केवल ऑब्जेक्ट बनाता है: "फू बन जाता है!" (प्रतिलिपि प्रतिलिपि), जबकि प्रतिलिपि elision अक्षम के साथ यह वस्तु दो बार प्रतिलिपि बनाता है। क्या एक चालक कन्स्ट्रक्टर नहीं है जिसे केवल एक रावल्यू कहा जाता है? मुझे पूरा यकीन नहीं है कि मेव() योग्यता प्राप्त करता है। –