const&
उस स्थिति में जीवनकाल का विस्तार नहीं करेगा। example here पर विचार करें जो अस्थायी बनाता है और फिर इसे प्रिंट करने का प्रयास करता है: यह आपके कोड के समान संरचनाओं का उपयोग कर रहा है, लेकिन मैंने इसे ऑब्जेक्ट निर्माण और विनाश को उपयोगकर्ता के लिए अधिक स्पष्ट बनाने के लिए बदल दिया है।
#include <iostream>
struct reporting {
reporting() { std::cout << "Constructed" << std::endl;}
~reporting() { std::cout << "Destructed" << std::endl;}
reporting(reporting const&) { std::cout << "Copy-Constructed" << std::endl;}
reporting(reporting &&) { std::cout << "Move-Constructed" << std::endl;}
reporting & operator=(reporting const&) { std::cout << "Copy-Assigned" << std::endl; return *this;}
reporting & operator=(reporting &&) { std::cout << "Move-Assigned" << std::endl; return *this;}
void print() const {std::cout << "Printing." << std::endl;}
};
const reporting& get_or(const reporting& def)
{
return def;
}
int main()
{
const reporting& foo = get_or(reporting{});
foo.print();
return 0;
}
आउटपुट:
Constructed
Destructed
printing.
नोट कैसे वस्तु से पहले printing.
प्रदर्शित किया जाता है नष्ट हो जाता है।
आप सोच रहे होंगे कि कोड अभी भी कोई दृश्य त्रुटियों के साथ पूरा क्यों नहीं होता है: यह अपरिभाषित व्यवहार का परिणाम है। प्रश्न में वस्तु मौजूद नहीं है, लेकिन क्योंकि यह राज्य पर अपनी विधि का आह्वान करने पर निर्भर नहीं है, कार्यक्रम क्रैश नहीं होता है। अन्य, अधिक जटिल उदाहरणों में कोई गारंटी नहीं लेनी चाहिए कि यह बिना किसी दुर्घटनाग्रस्त या अन्य, अप्रत्याशित व्यवहार के कारण काम करेगा।
संयोग से, बातें करता है, तो अस्थायी bound directly to the const&
है थोड़ा अलग हैं:
#include <iostream>
struct reporting {
reporting() { std::cout << "Constructed" << std::endl;}
~reporting() { std::cout << "Destructed" << std::endl;}
reporting(reporting const&) { std::cout << "Copy-Constructed" << std::endl;}
reporting(reporting &&) { std::cout << "Move-Constructed" << std::endl;}
reporting & operator=(reporting const&) { std::cout << "Copy-Assigned" << std::endl; return *this;}
reporting & operator=(reporting &&) { std::cout << "Move-Assigned" << std::endl; return *this;}
void print() const {std::cout << "printing." << std::endl;}
};
const reporting& get_or(const reporting& def)
{
return def;
}
int main()
{
const reporting& foo = reporting{};
foo.print();
return 0;
}
आउटपुट:
Constructed
printing.
Destructed
देखें कैसे वस्तु जब तक के बाद यह प्रयोग किया जाता है को नष्ट कर दिया नहीं है। इस स्थिति में, वस्तु दायरे के अंत तक जीवित रहती है।
स्वीकार किए जाते हैं जवाब आपके द्वारा संदर्भित प्रश्न (जो मानक उद्धृत करता है) स्पष्ट रूप से दो मामलों का कहना है जहां यह काम नहीं करता है। आपका उदाहरण दूसरा मामला है: फ़ंक्शन कॉल में संदर्भ पैरामीटर के लिए अस्थायी बाध्य। तो उत्तर नहीं है। –