C ++ 11 से पहले, हम केवल अभिन्न या गणन प्रकार के स्थिर कॉन्स्ट सदस्यों पर इन-क्लास आरंभीकरण कर सकते थे। Stroustrup अपने C ++ FAQ में इस पर चर्चा करते हैं , निम्न उदाहरण देते हैं:
class Y {
const int c3 = 7; // error: not static
static int c4 = 7; // error: not const
static const float c5 = 7; // error: not integral
};
और निम्नलिखित तर्क:
तो ये असुविधाजनक प्रतिबंध क्यों मौजूद हैं? हेडर फ़ाइल में आमतौर पर एक वर्ग घोषित किया जाता है और हेडर फ़ाइल को आमतौर पर कई अनुवाद इकाइयों में शामिल किया जाता है। हालांकि, जटिल लिंकर नियमों से बचने के लिए, C ++ के लिए आवश्यक है कि प्रत्येक वस्तु की एक अनूठी परिभाषा हो। उस नियम को तोड़ा जाएगा, यदि C ++ को उन संस्थाओं की इन-क्लास परिभाषा की अनुमति दी जाए, जिन्हें स्मृति में वस्तुओं के रूप में संग्रहीत करने की आवश्यकता है।
हालाँकि, C ++ 11 इन प्रतिबंधों को शिथिल करता है, जिससे गैर-स्थैतिक सदस्यों की इन-क्लास आरंभीकरण की अनुमति मिलती है (.612.6.2 / 8):
एक गैर-प्रतिनिधि निर्माणकर्ता में, यदि किसी दिए गए गैर-स्थैतिक डेटा सदस्य या आधार वर्ग को एक मेम-इनिशलाइज़र-आईडी द्वारा निर्दिष्ट नहीं किया जाता है (इस मामले में जहां कोई मेम-इनिशियलाइज़र-सूची नहीं है क्योंकि कंस्ट्रक्टर के पास कोई ctor-initializer नहीं है ) और इकाई एक अमूर्त वर्ग (10.4) का आभासी आधार वर्ग नहीं है, तब
- यदि इकाई एक गैर-स्थैतिक डेटा सदस्य है जिसमें ब्रेस-या-सम-इनिशलाइज़र है , तो इकाई को 8.5 में निर्दिष्ट के रूप में आरंभीकृत किया जाता है;
- अन्यथा, यदि इकाई एक भिन्न सदस्य (9.5) है, तो कोई प्रारंभ नहीं किया जाता है;
- अन्यथा, इकाई डिफ़ॉल्ट-आरंभिक (8.5) है।
धारा 9.4.2 गैर-स्थैतिक सदस्यों के इन-क्लास आरंभीकरण की अनुमति देता है यदि वे constexpr
विनिर्देशक के साथ चिह्नित हैं ।
तो हमारे पास C ++ 03 में प्रतिबंधों के कारणों का क्या हुआ? क्या हम सिर्फ "जटिल लिंकर नियमों" को स्वीकार करते हैं या कुछ और बदल गया है जो इसे लागू करना आसान बनाता है?