सी ++ 14 में इस बीमार बनाई है और पूर्ववर्ती संस्करण:
using fp2_type = void(*)() noexcept;
कारण N4140 [except.spec]/2:
एक अपवाद-विनिर्देश प्रकट नहीं करेगा एक टाइपिफ़ घोषणा में या उपनाम-घोषणा में।
तो मुझे लगता है कि प्रश्न सी ++ 1z के लिए है, जहां अपवाद विनिर्देश प्रकार प्रणाली का हिस्सा है।
[conv.fctptr]/1:
"noexcept
कार्य करने के लिए सूचक" प्रकार का एक prvalue के प्रकार का एक prvalue "सूचक कार्य करने के लिए" परिवर्तित किया जा सकता है। परिणाम फ़ंक्शन के लिए एक सूचक है।
इस प्रकार, void (*)() noexcept
(अंतर्निहित रूप से) void (*)()
में परिवर्तित किया जा सकता है।
[expr.static.cast]/7:
किसी भी मानक रूपांतरण अनुक्रम का प्रतिलोम (क्लॉज [रूपा]) नहीं एक [(विभिन्न अन्य मामलों छोड़े गए)] समारोह सूचक ([conv.fctptr]) रूपांतरण युक्त, हो सकता है निष्पादित रूप से static_cast
का उपयोग किया।
[expr.static.cast] में और कुछ भी नहीं है void (*)() noexcept
को void (*)()
परिवर्तित करने की अनुमति देता है या तो, तो यह एक रूपांतरण है कि एक static_cast
द्वारा किया जा सकता है।
[expr.reinterpret.cast]/6:
एक समारोह सूचक स्पष्ट रूप से एक अलग प्रकार के एक समारोह सूचक में बदला जा सकता। फ़ंक्शन प्रकार ([dcl.fct]) पर पॉइंटर के माध्यम से फ़ंक्शन को कॉल करने का प्रभाव जो फ़ंक्शन की परिभाषा में उपयोग किए गए प्रकार जैसा नहीं है, वह अनिर्धारित है। सिवाय इसके कि प्रकार का एक prvalue "सूचक T1
को" प्रकार (जहां T1
और T2
समारोह प्रकार के होते हैं) "सूचक T2
करने के लिए" अपने मूल प्रकार को बदलने और वापस पैदावार मूल सूचक मूल्य, इस तरह के एक सूचक का परिणाम रूपांतरण अनिर्दिष्ट है।[नोट: पॉइंटर रूपांतरणों के विवरण के लिए [conv.ptr] भी देखें। - अंत नोट]
तो reinterpret_cast
इस रूपांतरण को निष्पादित कर सकता है।
fp2_type(fp)
के बाद से, डाली (fp2_type) fp
([expr.type.conv]/1), और since C-style casts do a reinterpret_cast
when static_cast
is not possible (सादगी के लिए const_cast
अनदेखी, के रूप में इसे यहाँ प्रासंगिक नहीं है) सी-शैली के बराबर है fp2_type(fp)
एक अच्छी तरह से गठित reinterpret_cast
है। हालांकि, इस तरह के कलाकारों का परिणाम इसका उपयोग नहीं किया जा सकता है, हालांकि इसे वापस डालने के अलावा।
"दूसरी तरफ" ठीक है और वास्तव में एक निहित रूपांतरण है। 'fp2_type (fp) 'ऐसा लगता है कि यह' reinterpret_cast' होना चाहिए। –
दिलचस्प सवाल। नोट: * "15.4.12 एक अपवाद विनिर्देश को फ़ंक्शन के प्रकार का हिस्सा नहीं माना जाता है" * –
असल में, यह टाइप सिस्टम के अपवाद विनिर्देश भाग के पहले या बाद में है (यानी, यह C++ 1z या C + के लिए है + 14/पुराने)? –