2015-08-31 5 views
14

N4527 14.5.5.1 [temp.class.spec.match]मिलान आंशिक विशेषज्ञताओं

2 एक आंशिक विशेषज्ञता किसी दिए गए वास्तविक टेम्पलेट तर्क सूची से मेल खाता है, तो आंशिक विशेषज्ञता के टेम्पलेट तर्क निष्कर्ष निकाला जा सकता है वास्तविक टेम्पलेट तर्क सूची से।

template<class T1, class T2, int I> class A    { }; // #1 
template<class T, int I>   class A<T, T*, I> { }; // #2 
template<class T1, class T2, int I> class A<T1*, T2, I> { }; // #3 
template<class T>     class A<int, T*, 5> { }; // #4 
template<class T1, class T2, int I> class A<T1, T2*, I> { }; // #5 

A<int, int, 1> a1; // uses #1 
A<int, int*, 1> a2; // uses #2, T is int, I is 1 
A<int, char*, 5> a3; // uses #4, T is char 
A<int, char*, 1> a4; // uses #5, T1 is int, T2 is char, I is 1 
A<int*, int*, 2> a5; // ambiguous: matches #3 and #5 

3 एक गैर प्रकार टेम्पलेट तर्क भी प्राथमिक टेम्पलेट की एक गैर प्रकार पैरामीटर का एक वास्तविक टेम्पलेट तर्क के मान से निष्कर्ष निकाला जा सकता है। [उदाहरण: उपरोक्त a2 की घोषणा। अंत उदाहरण]

4 एक प्रकार का नाम है कि एक वर्ग टेम्पलेट विशेषज्ञता के लिए संदर्भित करता है, (उदाहरण के लिए, A<int, int, 1>) तर्क सूची प्राथमिक टेम्पलेट के टेम्पलेट पैरामीटर सूची से मेल करेगा। विशेषज्ञता के टेम्पलेट तर्क प्राथमिक टेम्पलेट के तर्कों से घटाए गए हैं।

rule3 में, उदाहरण दिखाता है I तीसरे वास्तविक टेम्पलेट तर्क 1 से निष्कर्ष निकाला है, यह क्या rule2 कहते है। तो नियम 4 की दूसरी वाक्य के रूप में, मुझे लगता है कि यह दोहराता है कि नियम 2 क्या कहता है।

उनके बीच अंतर क्या हैं (नियम 2, नियम 3 और नियम 4)?

एक और शब्द, हमारे पास पहले से ही नियम 2 है, नियम 3 के इरादे (अर्थ) और नियम 4 की दूसरी वाक्य क्या हैं, वे यहां क्यों हैं?

+0

जाहिर है यह शब्द एक [लंबे समय] के लिए चारों ओर हो गया है (https://web.cs.dal.ca/~vlado/pl/cpp.txt)। – Barry

+0

@ बैरी कुछ मानक पुरातत्व करना, ऐसा लगता है कि [N0668] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1995/N0668.pdf) (मार्च, 1995)। तो कहीं और [N1043] (https://web.cs.dal.ca/~vlado/pl/cpp.txt) (दिसंबर, 1 99 6) के बीच में आपने उद्धृत किया है, उदाहरण विस्तृत किया जाना चाहिए। दुर्भाग्य से, सभी काम कर रहे पेपर ड्राफ्ट ऑनलाइन नहीं हैं। विशेष रूप से, [एन0836] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1996/N0836.pdf) प्रासंगिक हो सकता है। – TemplateRex

+0

नहीं एक असली जवाब है, लेकिन नियम 4 थोड़ा निरर्थक लगता है, तर्क लागू करने के लिए है कि आंशिक विशेषज्ञताओं प्राथमिक टेम्पलेट का आंशिक विशेषज्ञताओं वास्तव में कर रहे हैं हो सकता है। बहरहाल, यह पहले से ही [temp.class.spec] /8.4 में निर्दिष्ट किया जाता: "विशेषज्ञता प्राथमिक टेम्पलेट की तुलना में अधिक विशिष्ट हो जाएगा।" – TemplateRex

उत्तर

2

मुझे लगता है, नियम [temp.class.spec।

[temp.class.spec.match] 14.5.5.1 \ 2 (संशोधित)

एक आंशिक विशेषज्ञता: मैच] 14.5.5.1 \ 2 अपनी मुराद को बदले बिना इस तरह फिर से लिखा जा सकता है किसी दिए गए वास्तविक टेम्पलेट तर्क सूची से मेल खाता है यदि आंशिक विशेषज्ञता के टेम्पलेट तर्कों को 14.8.2.5 के अनुसार वास्तविक टेम्पलेट तर्क सूची से को घटाया जा सकता है, जहां पी अपने सरल-टेम्पलेट से आंशिक विशेषज्ञता की तर्क सूची है -id और ए है वास्तविक टेम्पलेट तर्क सूची।

नियम [temp.deduct.type] 14.8.2.5 \ 1 प्रकार से बात का अनुमान लगाना के लिए प्रक्रिया को परिभाषित करता है (मैं हालांकि टेम्पलेट्स के बारे में निश्चित नहीं हूँ) केवल, इसलिए शासन [के लिए एक की जरूरत है temp.class.spec.match] 14.5.5.1 \ 3, जो 14.5.5.1 \ 2 प्राथमिक टेम्पलेट के गैर-प्रकार टेम्पलेट पैरामीटर वाले मामलों को जोड़ता है, जो आंशिक विशेषज्ञता में विशिष्ट नहीं हैं (आंशिक रूप से)।

नियम [temp.class.spec.match] 14.5.5.1 \ 4, जैसा कि आप ऊपर (1, 2) टिप्पणी में बताया गया है, सिर्फ स्पष्टीकरण है, टेम्पलेट आईडी में उस टेम्पलेट तर्क प्राथमिक टेम्पलेट के टेम्पलेट पैरामीटर से मेल खाता है, न कि इसकी आंशिक विशेषज्ञता, जिसमें अलग-अलग टेम्पलेट-पैरामीटर-सूची एस हो सकती है। इसके अलावा, शासन के दूसरे वाक्य सबसे अधिक संभावना का दावा है कि प्राथमिक टेम्पलेट (14.5.5 \ 4) की अंतर्निहित टेम्पलेट तर्क सूची निष्कर्ष निकाला है (!) [temp.deduct.type] 14.8.2.5 \ 9 के अनुसार वास्तविक तर्क सूची से। तो वाक्यांश "प्राथमिक टेम्पलेट की निहित टेम्पलेट तर्क सूची" और "विशेषज्ञता के टेम्पलेट तर्क" में एक आत्मसमर्पण की बात है, और वाक्यांश "प्राथमिक टेम्पलेट के तर्क" और "वास्तविक टेम्पलेट तर्क सूची" वाक्यांशों का अर्थ है एक और स्वयं की चीज ... लेकिन यह भी हो सकता है कि लेखकों को इस बारे में करने का इरादा:

[temp.class.spec.match] 14.5.5.1 \ 4 (संशोधित)

एक प्रकार का नाम को संदर्भित करता है में एक वर्ग टेम्पलेट विशेषज्ञता तर्क सूची प्राथमिक टेम्पलेट की टेम्पलेट पैरामीटर सूची से मेल खाती है। आंशिक विशेषज्ञता के टेम्पलेट तर्क प्राथमिक टेम्पलेट के तर्कों से लिया जाता है।

जो कुछ भी ...

+0

दूसरे शब्दों में, यह भी हो सकता है कि लेखकों ने 14.5.5.1 \ 4 में "विशेषज्ञता के टेम्पलेट तर्क" वाक्यांश द्वारा "** आंशिक ** विशेषज्ञता के टेम्पलेट तर्क" को निहित किया हो। [बिंगो] (http://stackoverflow.com/questions/34552056/what-does-the-template-arguments-of-a-specialization-are-deduced-from-the-argum)? –

2

नियम दो और नियम चार के बीच अंतर दूसरा और तीसरा टेम्पलेट पैरामीटर है। उदाहरण के तीन में:

A<int, char*, 5> a3; // uses #4, T is char

यह rule4 का उपयोग करता है क्योंकि तीसरे पैरामीटर स्पष्ट रूप से एक स्थिरांक पूर्णांक से 5 माहिर हैं, और दूसरा पैरामीटर एक सूचक प्रकार स्वीकार करने के लिए विशेष है; यह class A का एक अद्वितीय विशेषज्ञता है।

मैं प्रत्येक विशेषज्ञता को कक्षा की विशिष्ट प्रजातियों के रूप में देखता हूं, और प्रत्येक स्पेश के पास एक अद्वितीय हस्ताक्षर होता है (ओवरलोडिंग कार्यों के समान)। कंपाइलर उस विशेषज्ञता का चयन करने जा रहा है जो उपयोग किए जाने वाले हस्ताक्षर से मेल खाता है।

नियम तीन ही नियम पाँच बिना समझ में आता है, इसलिए शासन पाँच हटाने के बाद, नियम तीन के इरादे से किसी typenames विशेषज्ञ होगा class A कि: a) do not use a const int 5 for the third parameter b) do not use a pointer or as the second parameter c) do not use a `int` in the second parameter.

के बाद से अपने उदाहरण के गैर की अनूठी हस्ताक्षर का उपयोग नियम 3, उनमें से कोई नियम 3 का उपयोग नहीं करता है (दिए गए हम संदिग्ध नियम 5 को हटाते हैं)।

यह समझने के लिए बेहतर हो सकता है कि क्या आप विशेषज्ञता के template<...> योजना को देखते हैं, न कि विशेषज्ञता के <> हस्ताक्षर। विशेषज्ञता को देखने से पहले कंपाइलर टेम्पलेट योजना को देख रहा है। साथ ही, class A की सभी अन्य विशेषज्ञता किसी भी नए विशेषज्ञता के नियमों को परिभाषित करती है। विशेषज्ञता के इरादे को समझने के लिए, आपको अन्य सभी विशेषज्ञताओं के इरादे को समझना होगा, और विशेषज्ञता के इरादे को मानक द्वारा परिभाषित नहीं किया गया है, जिसे परिभाषित करने वाले किसी भी व्यक्ति द्वारा परिभाषित किया गया है; अर्थात। विशेषज्ञता के कार्यान्वयन विवरण वास्तव में इरादे को परिभाषित करते हैं।

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