18

इस उदाहरण में:उपयोग-घोषणा में, निर्भर नाम टेम्पलेट प्रतिस्थापन के बाद रचनाकारों को प्रस्तुत कर सकते हैं?

template<class T> 
struct S : T 
{ 
    using T::X; 
}; 

T::X एक आश्रित ऐसा नाम है जो सदस्य T में X को संदर्भित करता है। हैं S<T>T = X साथ instantiated है:

struct X 
{ 
    X(int) {} 
}; 
... 
S<X> s(42); 

का उपयोग कर-घोषणा इनहेरिट-निर्माता बन जाएगा?

क्लैंग DEMO कोड को अस्वीकार करता है, जबकि g ++ इसे स्वीकार करता है।

ध्यान दें कि अगर हम लिखें:

using T::X::X; 

दोनों compilers कोड को स्वीकार करने और विरासत-निर्माता के रूप में मानते हैं। using T::X मानक द्वारा विरासत-निर्माता बनने की अनुमति है?

उत्तर

4

टीसी के लिए धन्यवाद। इसे इंगित करने के लिए:

Core issue 2070, जो ड्राफ्टिंग चरण में है (यह एक समस्या होने की पुष्टि है, और समाधान की शब्दावली पर काम किया जा रहा है), इस मामले से संबंधित है। इस कोड को विरासत कन्स्ट्रक्टर के रूप में स्वीकार करने के लिए प्रस्तावित फिक्स दोनों आईडी को एक ही आईडी होना आवश्यक है।

इस प्रकाश में, क्लैंग से त्रुटि संदेश समझ में आता है, क्योंकि टी :: एक्स टाइप एक्स होगा, जो "टाइपनाम टैग के बिना टेम्पलेट से टाइप" त्रुटि को ट्रिगर करता है।

मूल पोस्ट:

तो मुझे लगता है कि असली सवाल यह है कि, "यह स्वीकार्य है कि एक टेम्पलेट इन्स्टेन्शियशन एक बयान का उपयोग करने का अर्थ अर्थ बदल है?"

और उत्तर है, यह अस्वीकृत नहीं है। मुझे नहीं पता कि यह बातचीत मानक के लेखकों द्वारा पूर्ववत और इरादे से थी या नहीं। लेकिन जहां तक ​​मैं देख सकता हूं, धारा 10 में उपयोग की घोषणा दोनों और धारा 17 में टेम्पलेट प्रारंभिक मानक, हां, using T::X द्वारा अनुमत है और हां, उपयोग की घोषणा एक विरासत कन्स्ट्रक्टर बन जाएगी जब टी है एक्स

+4

देखें [मूल मुद्दा 2070] (https://wg21.link/CWG2070)। –

+0

बहुत बहुत धन्यवाद, उत्तर अपडेट किया गया। – OmnipotentEntity

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

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