2012-12-05 26 views
7

एक टेम्पलेट उपनाम (उदा। एक अनुपलब्ध सदस्य टाइपनाम पर टेम्पलेट उपनाम, जैसा कि नीचे दिए गए कोड स्निपेट में है) में एक प्रतिस्थापन विफलता के मामले में, एक त्रुटि ट्रिगर की जानी चाहिए?टेम्पलेट उपनाम और sfinae

बजना और जीसीसी इस पर असहमत लगते हैं:

// some types 
struct bar { }; 

struct foo { 
    typedef void member_type; 
}; 


// template alias 
template<class T> 
using member = typename T::member_type; 


template<class T> 
void baz(...) { } 

// only works for gcc, clang fails with: no type named 'member_type' 
// in 'bar' 
template<class T> 
void baz(member<T>*) { } 


int main(int, char**) { 

    baz<bar>(0);   // picks first 
    baz<foo>(0);   // picks second 

    return 0; 
} 

तो सवाल यह है: जो सही है, और क्यों?

मानकों के अनुसार धन्यवाद :-)

+0

'clang -v' क्या कहता है? क्लैंग 3.3 ट्रंक कोड को ठीक से संकलित करता है। – Xeo

+0

डेबियन क्लैंग संस्करण 3.1-8 यहां, ऐसा लगता है कि मुझे बस प्रतीक्षा करने की आवश्यकता है। आपकी प्रतिक्रिया के लिए धन्यवाद ! – max

+0

क्या आप टेम्पलेट उपनाम से छुटकारा पा सकते हैं, बस थोड़ा सा – David

उत्तर

4

, यह स्पष्ट रूप से जीसीसी कि सही है, क्योंकि उर्फ ​​टेम्पलेट तुरंत बदला जाना चाहिए और उसके बाद सामान्य/सामान्य SFINAE बाद में जब T में जाना जाता है typename T::member_type को लागू किया जाता है।

लेकिन वर्तमान में इसके लिए एक मुद्दा है, http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1554 देखें।

बैठकों परिणाम के अनुसार, ऐसा लगता है कि clangs व्यवहार वांछित है: T का प्रतिस्थापन उर्फ ​​टेम्पलेट (यहां तक ​​कि typename T::member_type में प्रतिस्थापन के समय में हालांकि के संदर्भ में किया जाएगा, वहाँ उर्फ ​​के लिए कोई संदर्भ है टेम्पलेट अब - इसे अभी भी पैरामीटर प्रकार पैटर्न से उत्पन्न स्रोत के स्रोत के रूप में संदर्भित करने की आवश्यकता होगी, यदि यह इस प्रकार लागू किया गया है)।


यह एक और स्थिति है जहाँ पैटर्न परिभाषा समय पर फेंक दिया जाता है कि इन्स्टेन्शियशन अर्थ विज्ञान भी इस मामले में

template<int I> 
void f(int x[I]); 

int main() { 
    f<0>(nullptr); 
} 

को प्रभावित कर सकता, मेरी राय में स्टैंडर्ड normatively स्पष्ट है कि पैरामीटर है के समान है तुरंत int* द्वारा प्रतिस्थापित किया जा रहा है और इस प्रकार तत्काल कार्य करता है। http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1322 देखें।

+5

"बैठकों के नतीजों के मुताबिक, ऐसा प्रतीत होता है कि झुकाव व्यवहार वांछित है" - क्या यह पूरी तरह से किसी भी 'EnableIf' उपनाम को मार नहीं सकता है? यह * लगता है * उपनाम टेम्पलेट्स को SFINAE सॉफ्ट-त्रुटियां उत्पन्न नहीं करने के लिए अत्यधिक अवांछनीय है। – Xeo

+0

@Xeo हाँ यह बुरा होगा। और वास्तव में, क्लैंग ट्रंक 'EnableIf' उपनाम स्वीकार करता है, इसलिए यह मुझे लगता है कि पूछताछकर्ता केवल एक क्लैंग बग था, और यह कि wg21 साइट पर समस्या का सारांश सिर्फ भ्रमित (IMHO) है। –

+0

हाँ, मैं उलझन में था क्योंकि मैंने पहले ही टिप्पणी की है कि ट्रंक कोड को ठीक करता है। – Xeo

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