2012-08-15 15 views
10

क्या सी ++ 11 inline कार्यों या विधियों के बारे में कोई गारंटी देता है, जब वे noexcept क्वालीफायर के साथ घोषित अन्य कार्यों पर कॉल करते हैं?सी ++ 11 योग्यता योग्य और इनलाइन विधियों

class My_String { ... 

    const char * c_str() const noexcept; 
    inline operator const char *() const { return c_str(); } 
}; 

मुझे लगता है एक अनुकूलन संकलक पूर्ण एह बिना इनलाइन विधि को लागू करने और तनाव मुक्त होने के ढेर, प्रति noexcept योग्यता के रूप में करने के लिए स्वतंत्र होगा। मैं भी एक साधारण एक्सेसर विधि के लिए भी यह उम्मीद होती है: इस उदाहरण तुच्छ लग रहा है

... inline operator const char *() const { return m_buffer; } 

है, अपवाद बात जब अन्य वर्गों या कार्यों को लागू करने के लिए इस्तेमाल की गारंटी देता है। प्रश्न: क्या सी ++ 11 मानक पता है या इनलाइन विधियों को noexcept चिह्नित किया जाना चाहिए? या को को को कक्षा या फ़ंक्शन विनिर्देश से मेल खाने के लिए छोड़ना बेहतर है?

संपादित करें: कुछ भ्रम से बचने के लिए: noexcept इनलाइन विधि के लिए निहित है?

+1

उपयोगकर्ता के लिए प्रदान किया गया कोड 'noexcept' विनाशकर्ता के लिए ही निहित है, एक सरल जवाब के रूप में। –

+2

एक अनुवर्ती पर सवाल यह है: ** एक घोषित करना चाहिए 'noexcept' जब भी संभव हो ** – Walter

उत्तर

8

क्षमा करें, कोई। एकमात्र अंतर्निहित अपवाद-विनिर्देश

  • विनाशकों पर हैं।
  • दूसरी ओर परोक्ष या स्पष्ट रूप से घोषित विशेष सदस्य कार्यों चूक: डिफ़ॉल्ट रूप कंस्ट्रक्टर, कॉपी और चाल कंस्ट्रक्टर्स, और कॉपी और काम, जब एक वर्ग परिभाषा घोषित नहीं किया, या = default; साथ घोषित चलते हैं।
  • आवंटन रद्द करने कार्यों पर: operator delete और operator delete[]

तो उदाहरण के साथ घोषणा, noexcept(static_cast<const char*>(std::declval<const MyString>()))false होना चाहिए। आगे बढ़ें और noexcept लिखें जहां यह महत्वपूर्ण हो सकता है।

बेशक

, जैसा कि आप का उल्लेख किया, एक संकलक अनुकूलन अभी भी एक इनलाइन समारोह को नोटिस अपवाद फेंक नहीं कर सकते हैं और फोन करने वाले में अपवाद हैंडलिंग को आसान बनाने की अनुमति दी है।

+1

* अंतर्निहित' noexcept' की सूची * यदि आप याद कर रहे हैं कि विनाशकर्ता कि उपयोग किया जाता है की घोषणा की/परिभाषित परोक्ष जब तक हैं 'noexcept' में? उपयोगकर्ता ने एक अलग अपवाद विनिर्देश प्रदान किया। यह सी ++ 03 व्यवहार से सी ++ 11 का विचलन है। यही है, एक उपयोगकर्ता ने 'टी :: ~ टी() {फेंक 1 'जैसे विनाशक घोषित किया; } 'प्रोग्राम को समाप्त कर देगा, भले ही कोई अन्य अपवाद सक्रिय न हो (अपवाद विनिर्देश की कमी पर ध्यान दें) –

+0

मुझे याद आया कि मानक स्कैन करते समय धन्यवाद। – aschepler

+1

मूल उत्तर में भी चूक गया: स्पष्ट रूप से डिफॉल्ट किए गए विशेष सदस्य वही कार्य करते हैं जैसे कि घोषित रूप से घोषित किया गया हो। – aschepler