अभिव्यक्तियों का मूल्यांकन हमेशा उस बिंदु पर किया जाता है जब कार्यक्रम उन्हें पहुंचता है। अभिव्यक्ति का परिणाम हमेशा एक मान (या शून्य) होता है।
मानों में एक प्रकार है, और अभिव्यक्तियों की एक मूल्य श्रेणी होती है, जो कि किसी भी विशेष उपयोग पर ओवरलोड लोड का अधिक भार लोड करने के लिए संयोजन होता है।
आपके मामले में, string operator+(...)
श्रेणी पीआर-वैल्यू (जो कि एक प्रकार का रावल्यू है) के साथ स्ट्रिंग मान में परिणाम देता है। इसके बाद यह तुरंत स्ट्रिंग से जुड़ा हुआ है, इसलिए इसका जीवनकाल संदर्भ के लिए बढ़ाया गया है।
यदि आपने इसे सादे स्ट्रिंग में असाइन किया था, तो string& string::operator=(string&&)
उस ऑपरेटर के किसी अन्य ओवरलोड पर चुना गया होगा। ध्यान दें कि चूंकि सी ++ 11 संकलक की अनुमति है (और सी ++ 17 से आवश्यक) लक्ष्य वस्तु के अंदर सीधे मूल्य को मूर्त रूप देने के लिए। इस प्रक्रिया को कॉपी/मूव एलिशन या (एन) आरवीओ के रूप में जाना जाता है, नामित (नामांकित) रिटर्न वैल्यू ऑप्टिमाइज़ेशन।
त्वरित उत्तर के लिए धन्यवाद। ऐसा लगता है कि यदि 's2' सिर्फ एक और' std :: string' था, तो परिणाम समान होंगे, लेकिन परिणामी द्विआधारी अलग-अलग होंगी? –
@ ब्रैडीडीन हां परिणाम वही है। परिणाम द्विआधारी के बारे में कहना मुश्किल है; वैसे भी मैंने कोशिश की [यहां] (https://gcc.godbolt.org/) और यह वही असेंबली देता है। – songyuanyao
ध्यान दें कि यह C++ 17 में इस तरह से परिवर्तन करता है जो इस मामले में शून्य अवलोकन करने योग्य अंतर बनाता है। – Yakk