यह शायद एक दार्शनिक सवाल है, लेकिन मैं निम्नलिखित समस्या में पड़ गए:std :: फ़ंक्शन उदाहरणों का डिफ़ॉल्ट कन्स्ट्रक्टर क्यों होता है?
आप एक std :: समारोह को परिभाषित है, और आप इसे सही ढंग से शुरू नहीं किया जा रहा है, तो आपके आवेदन इस तरह, दुर्घटना होगा:
typedef std::function<void(void)> MyFunctionType;
MyFunctionType myFunction;
myFunction();
समारोह एक तर्क के रूप पारित हो जाता है, तो इस तरह:
void DoSomething (MyFunctionType myFunction)
{
myFunction();
}
तो, ज़ाहिर है, यह भी दुर्घटनाओं। इसका मतलब है कि मैं इस तरह की जाँच के कोड जोड़ने के लिए मजबूर कर रहा हूँ:
void DoSomething (MyFunctionType myFunction)
{
if (!myFunction) return;
myFunction();
}
इन चेकों की आवश्यकता होती है मुझे पुराने सी दिनों, जहां आप भी स्पष्ट रूप से सभी सूचक तर्क की जांच करने के लिए किया था करने के लिए एक फ्लैश-बैक देता है:
void DoSomething (Car *car, Person *person)
{
if (!car) return; // In real applications, this would be an assert of course
if (!person) return; // In real applications, this would be an assert of course
...
}
क
void DoSomething (Car &car, Person &person)
{
// I can assume that car and person are valid
}
तो,:
सौभाग्य से, हम सी ++, जो मुझे इन चेक (लेखन यह सोचते हैं कि फोन करने वाले कार्य करने के लिए एक nullptr की सामग्री में सफल नहीं हुए से रोकता में संदर्भ का उपयोग कर सकते हैं y do std :: फ़ंक्शन इंस्टेंस में एक डिफ़ॉल्ट कन्स्ट्रक्टर है? डिफ़ॉल्ट कन्स्ट्रक्टर के बिना आपको किसी अन्य फ़ंक्शन के सामान्य तर्कों की तरह चेक जोड़ने की ज़रूरत नहीं है। और उन 'दुर्लभ' मामलों में जहां आप 'वैकल्पिक' std :: फ़ंक्शन को पास करना चाहते हैं, आप अभी भी एक पॉइंटर पास कर सकते हैं (या बूस्ट :: वैकल्पिक का उपयोग करें)।
यह क्रैश नहीं होता है; यह एक अपवाद फेंकता है। –
'functors' के बारे में पढ़ें: http://www.sgi.com/tech/stl/functors.html –
" मुझे चेक कोड जोड़ने के लिए मजबूर होना पड़ता है "- शर्म की बात है कि आपके कॉलर इसके बजाय अपना कोड ठीक नहीं कर सकते हैं। अपवाद को संभालने के लिए उन्हें बचाने के लिए निरस्त करने के लिए अजीब लगता है। फिर भी, यह खराब हो सकता है, अगर आपने कोई फ़ंक्शन पॉइंटर लिया और उन्होंने इसे प्रारंभ करने से परेशान नहीं किया, तो इसका अनिश्चित मूल्य होगा और व्यवहार अपरिभाषित होगा। वे शायद आपके काम को बुलाए जाने की तुलना में 'स्ट्रेल' को बुरी तरह बुरी तरह गड़बड़ कर रहे हैं। –