मेरा मानना है कि ये अनिवार्य रूप से [temp.inst] / 2 (जोर मेरा) को उबालते हैं :
एक वर्ग टेम्पलेट विशेषज्ञता के अंतर्निहित इन्स्टेन्शियशन घोषणाओं के अंतर्निहित इन्स्टेन्शियशन का कारण बनता है, लेकिन परिभाषाओं की नहीं , डिफ़ॉल्ट तर्क या noexcept-विनिर्देशक के वर्ग के सदस्य काम करता है, सदस्य कक्षाएं, scoped सदस्य enumerations, स्थिर डेटा सदस्यों , सदस्य टेम्पलेट्स, और दोस्त; [...]
और [temp.inst] / 9
जब तक इस तरह के तात्कालिकता की आवश्यकता नहीं होती है, तब कार्यान्वयन एक तात्कालिक डेटा […] एक वर्ग टेम्पलेट के स्थैतिक डेटा सदस्य […] नहीं होगा।
अंतर्निहित टेम्पलेट तात्कालिकता के विषय में मानक में शब्दांकन कई विवरणों को व्याख्या के लिए खुला छोड़ देता है। सामान्य तौर पर, यह मेरे लिए प्रतीत होता है कि आप बस एक टेम्पलेट के कुछ हिस्सों पर भरोसा नहीं कर सकते नहीं instantiated जा रहा है जब तक कि विनिर्देश स्पष्ट रूप से ऐसा कहते हैं। इस प्रकार:
स्निपेट # 1
Q. यह कोड क्यों संकलित करता है? जब हम B से विरासत में आ रहे हैं, तो क्या हम A को तत्काल तैयार नहीं कर रहे हैं? बी में कोई वीडी नहीं है, इसलिए क्या कंपाइलर को यहां त्रुटि नहीं देनी चाहिए?
आप तात्कालिक हैं A<B>
। लेकिन A<B>
केवल तात्कालिकता घोषणाओं को तात्कालिक बनाती है, न कि इसके स्थैतिक डेटा सदस्यों की परिभाषाओं को। VB
कभी भी इस तरह से उपयोग नहीं किया जाता है कि परिभाषा की आवश्यकता होती है। संकलक को इस कोड को स्वीकार करना चाहिए।
स्निपेट # 2
प्र। यह gcc9 का संकलन क्यों करता है / यह clang9 के साथ संकलन क्यों नहीं करता है?
जैसा कि Jarod42 द्वारा बताया गया है, घोषणा AB
में एक प्लेसहोल्डर प्रकार शामिल है। यह मुझे प्रतीत होगा कि मानक का शब्दांकन वास्तव में स्पष्ट नहीं है कि यहां क्या होना चाहिए। क्या स्थैतिक डेटा सदस्य की घोषणा की तात्कालिकता में एक प्लेसहोल्डर प्रकार ट्रिगर प्लेसहोल्डर प्रकार कटौती शामिल है और इस प्रकार, एक उपयोग का गठन होता है जिसे स्थिर डेटा सदस्य की परिभाषा की आवश्यकता होती है? मैं उस मानक में शब्द नहीं खोज सकता जो स्पष्ट रूप से या तो हां या नहीं कहेगा। इस प्रकार, मैं कहूंगा कि दोनों व्याख्याएं समान रूप से यहां मान्य हैं और इस प्रकार, जीसीसी और क्लैंग दोनों सही हैं ...
स्निपेट # 3
प्र। यदि यहाँ स्ट्रक्चर बी अधूरा है तो स्निपेट # 2 में अधूरा क्यों है?
एक वर्ग प्रकार केवल उस बिंदु पर पूरा होता है, जहाँ आप कक्षा-विशेष के समापन }
पर पहुँचते हैं [class.mem] / 6 । इस प्रकार, आपके सभी स्निपेट्स में निहित तात्कालिकता के दौरान अधूरा है । यह सिर्फ इतना है कि यह स्निपेट # 1 के लिए अप्रासंगिक था। स्निपेट # 2 में, क्लैंग ने आपको परिणामस्वरूप त्रुटि दी । स्निपेट # 2 के मामले के समान, मुझे इस बात पर ध्यान नहीं दिया जा सकता है कि वास्तव में सदस्य उर्फ घोषणाओं को कब समाप्त किया जाएगा। हालांकि, स्थैतिक डेटा सदस्यों की परिभाषा के विपरीत, वर्ग टेम्पलेट के निहित तात्कालिकता के दौरान सदस्य उर्फ घोषणाओं की तात्कालिकता को स्पष्ट रूप से रोकने के लिए कोई जगह नहीं है। इस प्रकार, मैं कहूंगा कि GCC और दबंग दोनों का व्यवहार इस मामले में मानक की एक वैध व्याख्या है ... B
A<B>
No member named AD in B
struct B
तात्कालिकता नहीं है ?A
B