कारण यह है कि यदि वर्ग में उपयोगकर्ता-परिभाषित कंस्ट्रक्टर नहीं है, तो वह POD हो सकता है, और POD वर्ग डिफ़ॉल्ट रूप से आरंभीकृत नहीं होता है। इसलिए यदि आप POD की एक कांस्टेबल ऑब्जेक्ट घोषित करते हैं जो कि अनइंस्टॉलिज्ड है, तो इसका क्या उपयोग है? इसलिए मुझे लगता है कि मानक इस नियम को लागू करता है ताकि वस्तु वास्तव में उपयोगी हो सके।
struct POD
{
int i;
};
POD p1; //uninitialized - but don't worry we can assign some value later on!
p1.i = 10; //assign some value later on!
POD p2 = POD(); //initialized
const POD p3 = POD(); //initialized
const POD p4; //uninitialized - error - as we cannot change it later on!
लेकिन अगर आप कक्षा को गैर-पीओडी बनाते हैं:
struct nonPOD_A
{
nonPOD_A() {} //this makes non-POD
};
nonPOD_A a1; //initialized
const nonPOD_A a2; //initialized
पीओडी और गैर-पीओडी के बीच अंतर पर ध्यान दें।
उपयोगकर्ता-परिभाषित कंस्ट्रक्टर वर्ग को गैर-पीओडी बनाने का एक तरीका है। ऐसे कई तरीके हैं जिनसे आप ऐसा कर सकते हैं।
struct nonPOD_B
{
virtual void f() {} //virtual function make it non-POD
};
nonPOD_B b1; //initialized
const nonPOD_B b2; //initialized
ध्यान दें कि nonPOD_B उपयोगकर्ता-निर्धारित कंस्ट्रक्टर को परिभाषित नहीं करता है। इसे संकलित करें। यह संकलित करेगा:
और आभासी फ़ंक्शन पर टिप्पणी करें, फिर यह त्रुटि देता है, जैसा कि अपेक्षित है:
खैर, मुझे लगता है, आपने मार्ग को गलत समझा। यह पहली बार यह कहता है (.58.5 / 9):
यदि किसी ऑब्जेक्ट के लिए कोई इनिशियलाइज़र निर्दिष्ट नहीं किया गया है, और ऑब्जेक्ट (संभवतः cv-योग्य) नॉन-पॉड क्लास प्रकार (या इसके प्रकार) का है, तो ऑब्जेक्ट डिफ़ॉल्ट-आरंभीकृत होगा; [...]
यह गैर-पीओडी वर्ग के बारे में बात करता है जो संभवतः सीवी-योग्य प्रकार है। यदि निर्दिष्ट कोई इनिशियलाइज़र नहीं है, तो गैर-पीओडी ऑब्जेक्ट डिफ़ॉल्ट-आरंभिक होगा। और डिफ़ॉल्ट-आरंभिक क्या है ? गैर-पीओडी के लिए, युक्ति कहती है (/8.5 / 5),
टी प्रकार की एक वस्तु को डिफ़ॉल्ट-प्रारंभिक करने के लिए:
- यदि टी एक गैर-पीओडी वर्ग प्रकार (खंड 9) है, तो टी के लिए डिफ़ॉल्ट निर्माणकर्ता को बुलाया जाता है (और यदि टी कोई सुलभ डिफ़ॉल्ट निर्माता नहीं है, तो आरंभीकरण बीमार हो जाता है);
यह केवल T के डिफ़ॉल्ट निर्माता के बारे में बात करता है , चाहे इसका उपयोगकर्ता-परिभाषित या संकलक-जनित अप्रासंगिक हो।
यदि आप इसे स्पष्ट कर रहे हैं, तो समझें कि आगे की युक्ति क्या कहती है ((/8.5 / 9),
[...]; यदि ऑब्जेक्ट कांस्टेबल-योग्य प्रकार का है, तो अंतर्निहित वर्ग प्रकार में एक उपयोगकर्ता-घोषित डिफ़ॉल्ट निर्माता होगा।
तो इस पाठ का तात्पर्य है, यदि वस्तु कांस्टेबल-योग्य POD प्रकार की है, तो प्रोग्राम बीमार हो जाएगा और इसमें कोई इनिशियलाइज़र निर्दिष्ट नहीं है (क्योंकि POD डिफॉल्ट इनिशियलाइज़ नहीं हैं):
POD p1; //uninitialized - can be useful - hence allowed
const POD p2; //uninitialized - never useful - hence not allowed - error
वैसे, यह ठीक संकलित करता है , क्योंकि इसका गैर-पीओडी, और डिफ़ॉल्ट-प्रारंभिक किया जा सकता है ।
a, लेकिन gcc-4.3.4 इसे तब भी स्वीकार करता है जब आप इसे करते हैं (देखें ideone.com/uHvFS )