जवाबों:
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
यह एक झूलने वाला संदर्भ देता है, जैसे कि लैवल्यू संदर्भ मामले के साथ। फ़ंक्शन के वापस आने के बाद, अस्थायी ऑब्जेक्ट नष्ट हो जाएगा। आपको Beta_ab
निम्नलिखित की तरह मूल्य से वापस लौटना चाहिए
Beta_ab
Beta::toAB() const {
return Beta_ab(1, 1);
}
अब, यह Beta_ab
फ़ंक्शन के रिटर्न वैल्यू में एक अस्थायी ऑब्जेक्ट को ठीक से स्थानांतरित कर रहा है । यदि कंपाइलर कर सकता है, तो वह आरवीओ (रिटर्न वैल्यू ऑप्टिमाइज़ेशन) का उपयोग करके, चाल से पूरी तरह से बच जाएगा। अब, आप निम्न कार्य कर सकते हैं
Beta_ab ab = others.toAB();
और यह अस्थायी रूप से निर्माण करेगा ab
, या आरवीओ को एक चाल या प्रतिलिपि पूरी तरह से करने के लिए छोड़ देगा। मैं आपको BoostCon09 Rvalue References 101 पढ़ने की सलाह देता हूं जो इस मामले की व्याख्या करता है और कैसे (N) RVO के साथ बातचीत करने के लिए होता है।
आपका रेवेले संदर्भ वापस करने का मामला अन्य अवसरों में एक अच्छा विचार होगा। कल्पना कीजिए कि आपके पास एक getAB()
फ़ंक्शन है जिसे आप अक्सर एक अस्थायी पर आमंत्रित करते हैं। यह ऐसा करने के लिए इष्टतम नहीं है कि यह एक अस्थायी अंतराल के लिए एक लौटे रेवेलेरी लौटें। आप इसे इस तरह से लागू कर सकते हैं
struct Beta {
Beta_ab ab;
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return move(ab); }
};
ध्यान दें कि move
इस मामले में वैकल्पिक नहीं है, क्योंकि ab
न तो एक स्थानीय स्वचालित है और न ही एक अस्थायी प्रतिद्वंद्विता है। अब, रेफरी-क्वालीफायर का &&
कहना है कि दूसरा कार्य प्रतिद्वंद्विता के अस्थायी लोगों पर लागू किया गया है, प्रतिलिपि के बजाय निम्नलिखित कदम बना रहा है
Beta_ab ab = Beta().getAB();
यह अधिक कुशल हो सकता है, उदाहरण के लिए, थोड़ा अलग संदर्भ में:
template <typename T>
T&& min_(T&& a, T &&b) {
return std::move(a < b? a: b);
}
int main() {
const std::string s = min_(std::string("A"), std::string("B"));
fprintf(stderr, "min: %s\n", s.c_str());
return 0;
}
एक दिलचस्प अवलोकन के रूप में, मेरी मशीन पर clang++ -O3
नियमित रूप से 62 निर्देशों के ऊपर कोड के लिए 54 निर्देश उत्पन्न होते हैं std::min
। हालांकि, इसके साथ -O0
नियमित रूप से 481 से ऊपर कोड के लिए 518 निर्देश उत्पन्न करता है std::min
।
for(:)
और डीलॉक्लेटेड ऑब्जेक्ट पर एकीकृत किया। फिक्स: ideone.com/tQVOal
std::move()
बिंदु का अधिक स्पष्ट रूप से वर्णन करने के लिए एक स्पष्ट कलाकारों के रूप में उपयोग किया जाता है। यह ऐसा कोड नहीं है जिसे आप अपने प्रोजेक्ट में कॉपी-पेस्ट करेंगे। यह शीर्ष-मतदान जवाब का खंडन नहीं करता है, क्योंकि फ़ंक्शन के अंदर अस्थायी ऑब्जेक्ट बनाया जाता है। यहाँ लौटी वस्तु एक तर्क है (अस्थायी वस्तुओं को पूर्ण अभिव्यक्ति के मूल्यांकन के अंतिम चरण के रूप में नष्ट कर दिया जाता है जिसमें (शाब्दिक रूप से वह बिंदु होता है जहाँ वे बनाए गए थे)।