2016-02-29 12 views
8

जब मैं constexpr फ़ंक्शन को परिभाषित करता हूं, तो क्या मुझे इसे noexcept के रूप में घोषित करना चाहिए? मैं उस मामले में कल्पना करता हूं जहां तर्क और उपयोग संकलन-समय मूल्यांकन के लिए आवश्यकताओं को पूरा करते हैं, संभावित अपवादों का अर्थ म्यूट है। लेकिन यह उन मामलों के लिए सामान्य के रूप में लागू होगा जब कार्य रन का मूल्यांकन समय पर किया जाता है।क्या 'constexpr` फ़ंक्शन भी' अस्वीकरण 'होना चाहिए?

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

उत्तर

7

नहीं, आपको नहीं करना चाहिए।

"असफल नहीं हो सकता" और "संकलन समय पर मूल्यांकन किया जा सकता है" ऑर्थोगोनल मुद्दे हैं। उदाहरण के लिए, आप एक पूर्णांक पावर फ़ंक्शन लिखना चाहते हैं, लेकिन आप बिजली को हस्ताक्षरित के रूप में लेना चाहते हैं (क्योंकि आप मानते हैं कि हस्ताक्षरित संख्या केवल विशेष मामलों के लिए उपयोग की जानी चाहिए)। अब आप कहते हैं कि अगर बिजली नकारात्मक है तो आप अपवाद फेंकना चाहते हैं। सी ++ 14 में आप इसे इस तरह लिख सकते हैं:

constexpr int ipow(int base, int power) { 
    if (power < 0) throw std::domain_error("negative power"); 
    int result = 1; 
    for (int i = 0; i < power; ++i) result *= base; 
    return result; 
} 

स्पष्ट रूप से इस समारोह noexcept नहीं है, लेकिन गैर नकारात्मक तर्क के लिए, आप स्पष्ट रूप से यह संकलन समय पर मूल्यांकन कर सकते हैं। यदि आप किसी संदर्भ में नकारात्मक तर्कों के लिए प्रयास करते हैं जहां आपको संकलन समय पर परिणाम की आवश्यकता होती है, तो आपको एक संकलन त्रुटि मिलती है, जो ठीक होना चाहिए।

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