संभव डुप्लिकेट:
What happens if I return literal instead of declared std::string?समझने C++ 11 rvalues, अर्थ विज्ञान के लिए कदम और प्रदर्शन
निम्नलिखित कोड
1| string getName() {
2| return "meme";
3| }
4|
5| string name = getName();
समारोह getName (पर विचार करें) एक रिटर्न अस्थायी वस्तु। सी ++ 03 में, मैं समझता हूं कि "स्ट्रिंग" की कॉपी कन्स्ट्रक्टर को बुलाया जाता है और अस्थायी वस्तु नष्ट हो जाती है। दरअसल ऐसा लगता है कि संकलक (जीसीसी 4.7 में कम से कम) ऑब्जेक्ट "नाम" नहीं बनाकर लाइन 5 को अनुकूलित करता है लेकिन इसे अस्थायी ऑब्जेक्ट के साथ बदलता है और अस्थायी ऑब्जेक्ट को नष्ट नहीं करता है (मैंने एक MyVector क्लास के साथ प्रयास किया है, std :: string नहीं)।
जैसा कि सी ++ 11 मानकों में परिभाषित किया गया है,
1. क्या getName() एक रैवल्यू लौटा रहा है?
2. उपरोक्त पंक्ति 5 में, स्ट्रिंग के किस कन्स्ट्रक्टर को कॉल (चाल या प्रतिलिपि) कहा जाता है? क्या मुझे जरूरी कदम कन्स्ट्रक्टर के लिए कॉल करने के लिए std :: move() को कॉल करना चाहिए?
3. चाल semantics के साथ, यह संकलक द्वारा प्रदान की गई "प्रतिलिपि प्रतिलिपि" अनुकूलन कम कुशल है?
यह _copy elision _... –
@ के-बॉलो मुझे प्रबुद्ध करने के लिए धन्यवाद होगा। –
लाइन नंबर जोड़ना कमाल लग रहा है! कभी नहीं देखा कि पहले =) – qwertz