यह इस बात पर निर्भर करता है कि आप बाद में स्ट्रिंग के साथ क्या करते हैं।
यदि आपका प्रश्न मेरा कोड सही है? तो हाँ है।
से [dcl.fct.default] / 2
[ उदाहरण : घोषणा
void point(int = 3, int = 4);
एक फ़ंक्शन को घोषित करता है जिसे शून्य, एक या दो प्रकार के int के साथ बुलाया जा सकता है। इसे इनमें से किसी भी तरीके से बुलाया जा सकता है:
point(1,2); point(1); point();
अंतिम दो कॉल क्रमशः point(1,4)
और point(3,4)
, के बराबर हैं। - अंतिम उदाहरण ]
तो आपका कोड प्रभावी रूप से इसके बराबर है:
const std::string& s1 = foo(std::string(""));
std::string s2 = foo(std::string(""));
आपका सभी कोड सही है, लेकिन इनमें से किसी भी मामले में संदर्भ आजीवन विस्तार नहीं है, क्योंकि वापसी प्रकार एक संदर्भ है।
चूंकि आप किसी फ़ंक्शन को अस्थायी रूप से कॉल करते हैं, इसलिए जीवन भर लौटे स्ट्रिंग स्टेटमेंट का विस्तार नहीं करेंगे।
const std::string& s1 = foo(std::string("")); // okay
s1; // not okay, s1 is dead. s1 is the temporary.
आपके उदाहरण के साथ s2
ठीक है जब से आप satement के अंत से पहले अस्थायी से कॉपी (या स्थानांतरित) करते हैं। s3
से एक ही समस्या है s1
।
std::string
अपने स्वयं के वर्ग के साथ बदलें ताकि आप निर्माण और विनाश को ट्रैक कर सकें।