c++ - टाइप डबल के स्थिर वर्ग के सदस्य के लिए लगातार अभिव्यक्ति आरंभीकरण




c++11 c++14 (2)

C ++ 03 में हमें केवल गणना प्रकार के अभिन्न अंग के स्थिर सदस्य चर के लिए एक वर्ग इनिशियलाइज़र प्रदान करने की अनुमति दी गई थी, C ++ 11 में हम कॉन्स्टैक्स का उपयोग करके कक्षा में शाब्दिक प्रकार के एक स्थिर सदस्य को इनिशियलाइज़ कर सकते हैं। यह प्रतिबंध मुख्य रूप से संगतता के लिए कॉन्स्टेबल चर के लिए C ++ 11 में रखा गया था। C ++ 03 हम इसे बंद अंक 1826 से देख सकते हैं : स्थिर फ़्लोटिंग-पॉइंट निरंतर अभिव्यक्तियों में जो कहते हैं:

एक कॉन्स्टेंट के साथ इनिशियलाइज़ किया गया एक कॉन्स्टेंट पूर्णांक को कंटीन्यूअस एक्सप्रेशन्स में इस्तेमाल किया जा सकता है, लेकिन एक कॉन्टेस्ट के साथ इनिशियलाइज़ किया गया कॉन्स फ्लोटिंग पॉइंट वेरिएबल। यह जानबूझकर, कॉन्स्ट्रेक्स के लगातार उपयोग को प्रोत्साहित करते हुए C ++ 03 के साथ संगत होना था। हालांकि कुछ लोगों ने इस अंतर को आश्चर्यजनक पाया है।

सीडब्ल्यूजी ने इस अनुरोध को समाप्त कर दिया क्योंकि यह दोष ( एनएडी ) नहीं है, मूल रूप से कह रहा है:

निरंतर भावों में भाग लेने के लिए फ़्लोटिंग पॉइंट वैल्यू की इच्छा रखने वाले प्रोग्रामर को कॉन्स्ट्रेस के बजाय कॉन्स्टैक्स का उपयोग करना चाहिए।

संदर्भ के लिए N1804 C ++ 03 के लिए निकटतम मसौदा मानक सार्वजनिक रूप से धारा 9.4.2 में उपलब्ध है [class.static.data] कहते हैं:

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

और मसौदा सी ++ 11 मानक खंड 9.4.2 [class.static.data] कहते हैं:

यदि कोई गैर-वाष्पशील कास्ट स्टैटिक डेटा सदस्य अभिन्न या गणना का प्रकार है, तो क्लास डेफिनेशन में इसकी घोषणा एक ब्रेस-या-सम-इनिशलाइज़र निर्दिष्ट कर सकती है जिसमें प्रत्येक इनिशियलाइज़र-क्लॉज जो एक असाइनमेंट एक्सप्रेशन है एक स्थिर अभिव्यक्ति है (5.19) । शाब्दिक प्रकार के एक स्थैतिक डेटा सदस्य को कॉन्स्ट्रेक्स स्पेसियर के साथ वर्ग परिभाषा में घोषित किया जा सकता है; यदि ऐसा है, तो इसकी घोषणा एक ब्रेस-या-सम-इनिशलाइज़र निर्दिष्ट करेगी जिसमें प्रत्येक इनिशियलाइज़र-क्लॉज जो एक असाइनमेंट-एक्सप्रेशन है, एक स्थिर अभिव्यक्ति है। [...]

यह C ++ 14 मानक के मसौदे में बहुत समान है।

C ++ 11 और C ++ 14 में, मुझे निम्नलिखित स्निपेट में constexpr आवश्यकता क्यों है:

class Foo {
    static constexpr double X = 0.75;
};

जबकि यह एक संकलक त्रुटि पैदा करता है:

class Foo {
    static const double X = 0.75;
};

और (और अधिक आश्चर्यजनक रूप से) यह त्रुटियों के बिना संकलित करता है?

class Foo {
    static const double X;
};

const double Foo::X = 0.75;

इन-क्लास स्टैटिक कास्ट "परिभाषा" वास्तव में घोषणाएं हैं। जब एक चर को परिभाषित किया जाता है, तो संकलक उस चर के लिए मेमोरी आवंटित करता है, लेकिन यहां ऐसा नहीं है, अर्थात इन स्थैतिक-कास्ट-इन-क्लास चीजों का पता लगाने से बीमार हो जाता है, एनडीआर।

इन चीजों को कोड में काम करने वाला माना जाता है, लेकिन फ्लोटिंग पॉइंट प्रकारों के साथ ऐसा करना इतना आसान नहीं है, इसलिए इसकी अनुमति नहीं है।

वर्ग के बाहर अपने स्थिर कॉन्स्टेबल चर को परिभाषित करके आप संकलक को संकेत दे रहे हैं कि यह वास्तविक परिभाषा है - स्मृति स्थान के साथ वास्तविक उदाहरण।





constant-expression