2016-08-02 6 views
5

एक उदाहरणक्या संकलक किसी फ़ंक्शन की अस्वीकृति का निर्णय ले सकता है?

class X 
{ 
    int value; 
public: 
    X (int def = 0) : value (def) {} 

    void add (int i) 
    { 
     value += i; 
    } 
}; 

जाहिर है, समारोह void X::add (int) किसी भी अपवाद फेंक कभी नहीं होगा करते हैं।

मेरा सवाल है, क्या संकलक कोड का विश्लेषण कर सकता है और अपवादों को संभालने के लिए मशीन कोड उत्पन्न नहीं करने का निर्णय ले सकता है, भले ही फ़ंक्शन noexcept के रूप में चिह्नित न हो?

+0

मैं उत्सुक हूं, आप यह क्यों जानना चाहते हैं? – Randy

+1

क्या आपने अपने कंपाइलर द्वारा उत्पन्न कोड * चेक * किया है? –

+2

यह * * * की तरह * * * बता सकता है कि कोई फ़ंक्शन 'const' है या नहीं, या' constexpr' है। यह सब के बाद एक कंपाइलर है। चाहे वह * वास्तव में * करता है और चाहे वह * उपयोग करता है * वह जानकारी एक और सवाल है। –

उत्तर

6

यदि संकलक साबित कर सकता है कि कोई फ़ंक्शन कभी नहीं फेंकता है, तो इसे अपवादों को संभालने के लिए कोड को हटाने के लिए "As-If" नियम (§1.9, "C++ मानक का प्रोग्राम निष्पादन") द्वारा अनुमत किया जाता है।

हालांकि यह तय करना संभव नहीं है कि कोई फ़ंक्शन सामान्य में कभी फेंक नहीं देगा, क्योंकि यह हलिंग समस्या को हल करने के लिए है।

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

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