मान लीजिए मैं एक समारोह है कि कुछ साइड इफेक्ट करता है और फिर एक जवाब देता है:समारोह संकेत और वापसी प्रकार रूपांतरण
int foo()
{
perform_some_side_effect();
return 42;
}
मैं एक समारोह सूचक को foo
बाध्य करने के लिए चाहते हैं, लेकिन मैं में कोई दिलचस्पी नहीं हूँ जवाब है, बस पक्ष प्रभाव:
error: invalid conversion from ‘int (*)()’ to ‘void (*)()’
:
void (*bar)() = foo;
बहरहाल, यह एक प्रकार की त्रुटि हो गया लगता है
उस त्रुटि के पीछे तर्क क्या है? टाइप सिस्टम मुझे जवाब को अनदेखा क्यों नहीं करता है?
एक तरफ ध्यान दें पर, यह काम करता है अगर मैं में समारोह सूचक लपेट एक std::function
:
std::function<void()> baz = foo;
कैसे std::function
(जाहिरा तौर पर) प्रकार प्रणाली में इस प्रतिबंध को नाकाम करने के लिए प्रबंधन करता है?
तर्कसंगत सिर्फ इतना है कि वे विभिन्न प्रकार हैं है बनाने के लिए कुछ प्रवंचना लेता है। आप 'reinterpret_cast' के साथ इसे (अपने जोखिम पर) ओवरराइड कर सकते हैं। –
@ स्टेवनबर्नैप: सवाल यह है कि क्यों * वे परिवर्तित नहीं कर सकते हैं। यह स्पष्ट है कि वे विभिन्न प्रकार हैं। एक 'फ्लोट' या तो 'int' नहीं है, लेकिन आप उन्हें परिवर्तित कर सकते हैं। – Puppy
मुझे लगता है कि ऐसा इसलिए है क्योंकि एक सामान्य नियम के रूप में निहित पॉइंटर्स को अनुमति नहीं है। –