स्ट्रॉस्ट्रप की "द सी ++ प्रोग्रामिंग भाषा" से एक कोड यहां दिया गया है जो finally
लागू करता है जिसे मैं समझ नहीं सकता कि विनाशक कहां कहलाता है।सी ++ में किसी फ़ंक्शन से लौटे अस्थायी वस्तुओं के लिए विनाशक को कैसे बुलाया जाता है?
template<typename F> struct Final_action
{
Final_action(F f): clean{f} {}
~Final_action() { clean(); }
F clean;
}
template<class F>
Final_action<F> finally(F f)
{
return Final_action<F>(f);
}
void test(){
int* p=new int{7};
auto act1 = finally([&]{delete p;cout<<"Goodbye,cruel world\n";});
}
मैं इस के आसपास दो प्रश्न हैं:
लेखक के अनुसार,
delete p
केवल एक बार कहा जाता हो जाता है: जब Act1 क्षेत्र से बाहर चला जाता है। लेकिन मेरी समझ से: पहला,act1
प्रतिलिपि निर्माता, तो समारोह में अस्थायी वस्तुFinal_action<F>(f)
finally
विलुप्त हो जाता है के साथ, प्रारंभ की जाएगी समारोहtest
के अंत में पहली बार के लिएdelete p
बुला, फिर दूसरी बार जबact1
बाहर है दायरे का मुझे यह गलत कहां मिल रहा है?finally
फ़ंक्शन क्यों आवश्यक है? क्या मैं सिर्फFinal_action act1([&]{delete p;cout<<"Goodbye,cruel world\n"})
परिभाषित नहीं कर सकता? क्या वही है?
इसके अलावा, अगर कोई बेहतर शीर्षक के बारे में सोच सकता है, तो कृपया वर्तमान को संशोधित करें।
अद्यतन: कुछ और सोचने के बाद, अब मुझे आश्वस्त है कि विनाशक को तीन बार बुलाया जा सकता है। अतिरिक्त एक कॉलिंग फ़ंक्शन void test()
में अस्थायी ऑब्जेक्ट किए गए ऑटो-जेनरेट के लिए act1
की प्रतिलिपि बनाने के लिए तर्क के रूप में उपयोग किया जाता है। इसे g ++ में -fno-elide-constructors
विकल्प के साथ सत्यापित किया जा सकता है। जिन लोगों के पास मेरा वही प्रश्न है, उनके लिए बिल लिंच द्वारा दिए गए जवाब में Copy elision के साथ-साथ Return value optimization देखें।
प्रति प्रश्न एक प्रश्न, कृपया। –
re # 2 मुझे नहीं लगता कि क्यों नहीं। मुझे लगता है कि किसी को 'ऑटो' विचार से भ्रमित किया गया था, यह पढ़ना आसान था। –
@ लाइटनेसरेसेसिन ऑर्बिट टेम्पलेट तर्क कटौती। आप वास्तव में लैम्ब्डा की वजह से 'Final_action ??> 'के प्रकार को नहीं लिख सकते हैं। – Quentin