संदर्भ container
के पूरे जीवनकाल के लिए मौजूद होगा, लेकिन संदर्भित किया जा रहा है केवल उस वस्तु के जीवनकाल के लिए मौजूद होगा। इस मामले में, आपने स्वचालित संग्रहण आवंटन ("स्टैक आवंटन" के साथ एक अस्थायी ऑब्जेक्ट के संदर्भ में बाध्य किया है, यदि आप करेंगे, हालांकि यह C++ नामकरण नहीं है)। इसलिए, आप अस्थायी से उस बयान से परे मौजूद होने की उम्मीद नहीं कर सकते जिसमें लिखा गया था (क्योंकि यह container
के लिए कन्स्ट्रक्टर को कॉल के तुरंत बाद गुंजाइश से बाहर हो गया है)। इसके साथ निपटने का सबसे अच्छा तरीका एक संदर्भ के बजाय प्रतिलिपि का उपयोग करना है। चूंकि आप एक कॉन्स संदर्भ का उपयोग कर रहे हैं, वैसे भी, इसमें समान अर्थशास्त्र होगा।
आप अपने वर्ग को फिर से परिभाषित के रूप में करना चाहिए:
template<typename T>
class container
{
public:
container(const T& first, const T& second) : first(first), second(second) {}
private:
const T first;
const T second;
};
फिर, आप अपने वस्तुओं उन्हें क्षेत्र से बाहर जाने से रोकने के लिए कोई नाम दे सकते हैं:
adaptor first;
adaptor second;
container c(first,second);
हालांकि, मुझे नहीं लगता कि यह एक अच्छा विचार है, क्योंकि return c
जैसे बयान अवैध है।
संपादित
अपने लक्ष्य को आदेश नकल की लागत से बचने के लिए वस्तुओं साझा करने के लिए है, तो आप स्मार्ट सूचक वस्तुओं के उपयोग पर विचार करना चाहिए।
template<typename T>
class container
{
public:
container(const boost::shared_ptr<const T>& first, const boost::shared_ptr<const T>& second) : first(first), second(second) {}
private:
boost::shared_ptr<const T> first;
boost::shared_ptr<const T> second;
};
फिर आप उपयोग कर सकते हैं:
boost::shared_ptr<const adaptor> first(new adaptor);
boost::shared_ptr<const adaptor> second(new adaptor);
container<adaptor> c(first,second);
या, यदि आप स्थानीय स्तर पर पहले और दूसरे की परिवर्तनशील प्रतियां हैं:
उदाहरण के लिए, हम इस प्रकार स्मार्ट संकेत का उपयोग कर अपने वस्तु को फिर से परिभाषित कर सकते हैं
boost::shared_ptr<adaptor> first(new adaptor);
boost::shared_ptr<adaptor> second(new adaptor);
container<adaptor> c(boost::const_pointer_cast<const adaptor>(first),boost::const_pointer_cast<const adaptor>(second));
मुझे लगता है कि वास्तव में इस मामले में अस्थायी अगली वाक्य में एक फ़ंक्शन कॉल पैरामीटर (कन्स्ट्रक्टर कॉल) से जुड़ा हुआ है। हां, यह सीटीओ प्रारंभकर्ता में एलियासिंग की वजह से सदस्य के लिए भी बाध्य है, और हां, यह तब तक जारी रहेगा जब तक कि निर्माता बाहर निकलता है (वास्तव में, अगर कन्स्ट्रक्टर कॉल युक्त पूर्ण अभिव्यक्ति भी अन्य चीजें करता है)। लेकिन मुझे लगता है कि हाइलाइट किया गया मार्ग 'स्ट्रक्चर कंटेनर {कॉन्स एंड एडेप्टर ए' जैसी चीजों को संदर्भित करता है; कंटेनर(): ए (एडाप्टर()) {}}; '। –
@Steve: नज़दीक देखो, मुझे लगता है कि आप सही हैं - मैं जवाब अपडेट करूंगा (हालांकि एक ही परिणाम)। –