2013-03-17 8 views
6
#include <iostream> 

class A {}; 

typedef int (*j)() throw(A); 

int f() 
{ 
    std::cout << "function f" << std::endl; 
    return 0; 
} 

int main() 
{ 
    j y = f; 
    y(); 
} 

सभी साइटों में और स्ट्राउस्ट्रप भी कहते हैं कि संकलन त्रुटि होगी, लेकिन यह संकलित करता है। क्या मानक में कोई बदलाव है?क्या यह संकलन त्रुटि typedef int (* j)() फेंक (ए) है?

+0

कौन सा संकलक और कौन सा संस्करण? –

+0

माइक्रोसॉफ्ट विजुअल स्टूडियो 2012 –

+0

चूंकि आप दावा कर रहे हैं कि आप 'foo()' के प्रोटोटाइप में 'टाइपनाम ए' ऑब्जेक्ट फेंक रहे हैं, वास्तव में इसे अभी तक घोषित किए बिना, मैं नहीं देख सकता कि यह * कैसे नहीं है कंपाइलर त्रुटि। आपको 'ए' या "अपेक्षित') त्रुटि के लिए एक अनिर्धारित प्रतीक प्राप्त करना चाहिए। – WhozCraig

उत्तर

2

मैं जानता हूँ कि यह इस प्रश्न का उत्तर नहीं है -

MSVC 2010 (मेरे पास है) कोई त्रुटि फेंकता है, ठीक संकलित करता है तथा एक हिचकी

जी ++ (जीएनयू) का कहना है error: 'j' declared with an exception specification

बिना काम करता है

क्लैंग कहते हैं error: exception specifications are not allowed in typedefs

नीचे की रेखा: एमएसवीसी में कंपाइलर बग।

+4

यह एक एमएसवीसी बग नहीं है। यह अधिकांश अपवाद विनिर्देशों को अनदेखा करने के लिए एमएसवीसी की जानबूझकर पसंद है: केवल 'फेंक()' का प्रभाव पड़ता है। उनके पार्सर को अभी भी उन्हें स्वीकार करना है, और स्पष्ट रूप से यह उन्हें बहुत उदारता से स्वीकार करता है। Http://msdn.microsoft.com/en-us/library/wfa0edys.aspx – Sjoerd

+0

@Sjoerd - जानबूझकर या अन्यथा, यह एक बग देखें। कंपाइलर सी ++ मानक को सही ढंग से कार्यान्वित नहीं करता है। –

+0

मानक से कोई विचलन एक बग @Sjoerd delibrate या अन्यथा है! –

0

अपवाद विनिर्देश किसी फ़ंक्शन के प्रकार का हिस्सा नहीं हैं। उदाहरण के लिए, आप उन पर अधिभार नहीं लगा सकते हैं; और एक पॉइंटर-टू-फ़ंक्शन में अपवाद विनिर्देश नहीं होता है। जैसा कि @ एनीनेट कहते हैं, यह एक माइक्रोसॉफ्ट बग है कि उनका संकलक उस घोषणा को स्वीकार करता है।

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