2016-02-22 16 views
6

कहो मैं इन घोषणाओं है में एक समारोह सूचक कास्टिंग:एक noexcept निर्दिष्ट समारोह सूचक

using fp_type = void(*)(); 
using fp2_type = void(*)() noexcept; 

और

void func(){} 
fp_type fp(func); 

डाली fp2_type(fp) अच्छी तरह से गठित है? दूसरी तरफ (एक निष्पादन विनिर्देशक के बिना एक फ़ंक्शन पॉइंटर में एक अस्वीकरण-निर्दिष्ट फ़ंक्शन पॉइंटर कास्टिंग)?

+1

"दूसरी तरफ" ठीक है और वास्तव में एक निहित रूपांतरण है। 'fp2_type (fp) 'ऐसा लगता है कि यह' reinterpret_cast' होना चाहिए। –

+2

दिलचस्प सवाल। नोट: * "15.4.12 एक अपवाद विनिर्देश को फ़ंक्शन के प्रकार का हिस्सा नहीं माना जाता है" * –

+0

असल में, यह टाइप सिस्टम के अपवाद विनिर्देश भाग के पहले या बाद में है (यानी, यह C++ 1z या C + के लिए है + 14/पुराने)? –

उत्तर

3

सी ++ 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 है। हालांकि, इस तरह के कलाकारों का परिणाम इसका उपयोग नहीं किया जा सकता है, हालांकि इसे वापस डालने के अलावा।

+0

संबंधित प्रश्न, यदि आप किसी निरंतर फ़ंक्शन को नियमित रूप से परिवर्तित कर सकते हैं, तो क्या आप अब (या इसके विपरीत) कॉन्स्ट और अस्थिर सदस्य फ़ंक्शन पॉइंटर्स के साथ ऐसा कर सकते हैं? – dascandy

+0

सी ++ 11/14 के तहत कास्टिंग समस्या के लिए एक समाधान है। अस्वीकृति विनिर्देशक के साथ एक फ़ंक्शन घोषित करें, जैसे शून्य f() noexcept; फिर decltype (और एफ) (एफपी) की तरह कास्ट। शायद इसे अपने उत्तर में जोड़ें? – user1095108

संबंधित मुद्दे