मेरी सी ++ आवेदन में (दृश्य स्टूडियो 2010 का उपयोग), मैं इस तरह, एक std :: समारोह स्टोर करने के लिए की जरूरत है:क्या मुझे एक std :: फ़ंक्शन कॉपी करना चाहिए या क्या मैं हमेशा इसका संदर्भ ले सकता हूं?
class MyClass
{
public:
typedef std::function<int(int)> MyFunction;
MyClass (Myfunction &myFunction);
private:
MyFunction m_myFunction; // Should I use this one?
MyFunction &m_myFunction; // Or should I use this one?
};
आप देख सकते हैं, मैं निर्माता में एक संदर्भ के रूप में कार्य तर्क गयी।
लेकिन, मेरी कक्षा में फ़ंक्शन को स्टोर करने का सबसे अच्छा तरीका क्या है?
- क्या मैं फ़ंक्शन को संदर्भ के रूप में संग्रहीत कर सकता हूं क्योंकि std :: function केवल एक फ़ंक्शन-पॉइंटर है और फ़ंक्शन का 'निष्पादन योग्य कोड' स्मृति में रहने की गारंटी है?
- क्या मुझे लैम्ब्डा पास होने के मामले में एक प्रतिलिपि बनाना है और कॉलर लौटाता है?
मेरा आंत महसूस करता है कि संदर्भ (यहां तक कि एक कॉन्स्ट-रेफरेंस) स्टोर करना सुरक्षित है। मैं संकलक समय पर लैम्ब्डा के लिए कोड उत्पन्न करने की अपेक्षा करता हूं, और एप्लिकेशन को चलाने के दौरान इस निष्पादन योग्य कोड को 'वर्चुअल' मेमोरी में रखें। इसलिए निष्पादन योग्य कोड कभी भी 'हटाया नहीं जाता' है और मैं इसे सुरक्षित रूप से संदर्भित कर सकता हूं। लेकिन क्या यह वास्तव में सच है?
इससे कोई फर्क नहीं पड़ता कि 'std :: function' में क्या शामिल है ... यदि आप किसी को संदर्भित करते हैं जिसे संदर्भित किया जा रहा है, तो आपको कोई समस्या है। – Xeo
@Alex लपेटा गया फ़ंक्शन ऑब्जेक्ट, लैम्ब्डा या अन्य प्रकार का कोई फर्क नहीं पड़ता। सटीक वही सिद्धांत यहां किसी भी वस्तु के लिए लागू होते हैं जिसके लिए एक संदर्भ (सूचक सहित) का गठन किया जा सकता है। तो, अगर आप बाद में कॉल करने का प्रयास करते हैं तो डरावनी गारंटी दी जाती है (ए) एक 'std :: function'' std :: context_wrapper' द्वारा एक मज़ेदार को पारित किया जाता है, जहां निर्दिष्ट मज़ेदार का जीवनकाल समाप्त हो गया है, और/या (बी) एक संदर्भ 'std :: function' जहां रेफरेंस का जीवनकाल समाप्त हो गया है। –