2014-11-10 10 views
6

क्या फेंक विनिर्देश सहित फ़ंक्शन पॉइंटर घोषित करना संभव है? उदाहरण के लिए, मैं इस समारोह है:क्या मैं टाइपिफ़ फ़ंक्शन हस्ताक्षर में फेंकने की घोषणा कर सकता हूं?

void without_throw() throw() { 
} 

और एक समारोह है कि यह एक पैरामीटर के रूप में स्वीकार करता है, throw() भाग के साथ पूरा बनाने के लिए करना चाहते हैं। मैं इसे typedef को जोड़ने की है की कोशिश की, लेकिन वह काम करने के लिए प्रतीत नहीं होता:

typedef void (*without)() throw(); 

जीसीसी मुझे त्रुटि error: ‘without’ declared with an exception specification देता है।

उत्तर

7

आप इसे टाइप नहीं कर सकते हैं। यह मानक में स्पष्ट रूप से अनुमति नहीं है। (और जगह है कि noexcept के साथ मदद नहीं करता है, एक ही समस्या।)

का हवाला देते हुए सी ++ 11 मसौदा n3290 (§15.4/2 अपवाद विनिर्देशों)

एक अपवाद-विनिर्देश केवल पर प्रकट करेगा एक फ़ंक्शन प्रकार के लिए एक फ़ंक्शन घोषणाकर्ता, फ़ंक्शन प्रकार के लिए सूचक, फ़ंक्शन प्रकार का संदर्भ, या सदस्य फ़ंक्शन प्रकार के सूचक जो घोषणा या परिभाषा का शीर्ष-स्तर प्रकार है, या पैरामीटर या रिटर्न प्रकार के रूप में दिखाई देने वाले ऐसे प्रकार पर एक समारोह घोषणाकर्ता। एक अपवाद-विनिर्देश टाइपिफ़ घोषणा या उपनाम-घोषणा में प्रकट नहीं होगा। [उदाहरण:

void f() throw(int);   // OK 
void (*fp)() throw (int);  // OK 
void g(void pfa() throw(int)); // OK 
typedef int (*pf)() throw(int); // ill-formed 

– अंत उदाहरण]

दूसरे उदाहरण आप इस तरह कुछ करने के लिए अनुमति देता है:

void foo() throw() {} 
void bar() {} 

int main() 
{ 
    void (*fa)() throw() = foo; 
    void (*fb)() throw() = bar; // error, does not compile 
} 
2

इसके अलावा, आप अगर ग std :: समारोह का उपयोग कर सकते ++ 0x स्वीकार्य है:

#include <functional> 

void without_throw() throw() {} 

typedef std::function<void() throw()> without; 

int main() 
{ 
    without w = &without_throw; 
    w(); 
} 
संबंधित मुद्दे