2016-08-25 9 views
8

क्या डिफ़ॉल्ट टेम्पलेट पैरामीटर "डिफ़ॉल्ट मान" का उपयोग इस तरह से कर सकता है जो सही से शुरू नहीं होता है?डिफ़ॉल्ट टेम्पलेट पैरामीटर - सही से नहीं होना चाहिए? यह क्यों काम करता है?

मानदंड क्या है?
कंपाइलर कैसे व्याख्या करेगा?

उदाहरण के लिए, मुझे आश्चर्य है कि यह कोड काम करता है। https://ideone.com/l6d9du

उत्तर

8

टेम्पलेट तर्क कटौती अच्छी तरह से यहां काम करता है, क्योंकि फ़ंक्शन टेम्पलेट के लिए, बाद के टेम्पलेट तर्क फ़ंक्शन तर्कों द्वारा घटाए जा सकते हैं। इस मामले में, टेम्पलेट तर्क U फ़ंक्शन तर्क u से लिया जा सकता है। ध्यान दें कि क्लास टेम्पलेट के लिए, जैसा कि आपने अपेक्षित था, बाद में टेम्पलेट-पैरामीटर डिफ़ॉल्ट टेम्पलेट-तर्क के बाद या तो एक डिफ़ॉल्ट टेम्पलेट-तर्क होगा या टेम्पलेट पैरामीटर पैक होगा।

$14.1/11 Template parameters [temp.param]:

एक वर्ग टेम्पलेट, चर टेम्पलेट, या उर्फ ​​टेम्पलेट की एक टेम्पलेट पैरामीटर एक डिफ़ॉल्ट टेम्पलेट तर्क हैं, तो प्रत्येक बाद टेम्पलेट पैरामीटर या तो एक डिफ़ॉल्ट टेम्पलेट तर्क होगा आपूर्ति या टेम्पलेट पैरामीटर पैक हो। यदि प्राथमिक वर्ग टेम्पलेट का एक टेम्पलेट-पैरामीटर, प्राथमिक चर टेम्पलेट, या उपनाम टेम्पलेट टेम्पलेट पैरामीटर पैक है, तो यह अंतिम टेम्पलेट-पैरामीटर होगा। फ़ंक्शन टेम्पलेट का टेम्पलेट पैरामीटर पैक का पालन किसी अन्य टेम्पलेट पैरामीटर द्वारा नहीं किया जाएगा जब तक कि टेम्पलेट पैरामीटर फ़ंक्शन टेम्पलेट के पैरामीटर-प्रकार-सूची ([dcl.fct]) से घटाया गया हो या डिफ़ॉल्ट तर्क हो ([temp.deduct])। एक कटौती गाइड टेम्पलेट ([temp.deduct.guide]) का एक टेम्पलेट पैरामीटर में डिफ़ॉल्ट तर्क नहीं है कटौती मार्गदर्शिका टेम्पलेट की पैरामीटर-प्रकार-सूची से घटाया जाएगा। [उदाहरण:

template<class T1 = int, class T2> class B; // error 

// U can be neither deduced from the parameter-type-list nor specified 
template<class... T, class... U> void f() { } // error 
template<class... T, class U> void g() { } // error 

- अंत उदाहरण]

तुम देखो क्या होगा U undeducible बनाने के लिए कोशिश करते हैं और हो सकता है:

template <bool T=true, class U> //"default" from LEFT-most parameter 
void f(){ 
    if(T){ cout<<true;} 
    else cout<<false; 
} 
int main() { 
    f();   // Fail. Can't deduce U. 
    f<true>();  // Fail. Can't deduce U. 
    f<true, int>(); // Fine. T=true, U=int. 
    return 0; 
} 

नोट आप सभी टेम्पलेट तर्क स्पष्ट रूप से निर्दिष्ट करने के लिए कोड को काम करने के लिए, जो डिफ़ॉल्ट टेम्पलेट तर्कों को अर्थहीन बनाता है। यदि आप f() या f<true>() काम करना चाहते हैं, तो आपको U को एक डिफ़ॉल्ट टेम्पलेट-तर्क भी देना होगा (या इसे टेम्पलेट पैरामीटर पैक बनाएं)।

template <bool T=true, class U=int> 
void f(){ 
    if(T){ cout<<true;} 
    else cout<<false; 
} 
int main() { 
    f();    // Fine. T=true, U=int 
    f<false>();  // Fine. T=false, U=int 
    f<false, char>(); // Fine. T=false, U=char 
    return 0; 
} 
4

आप किसी भी पैरामीटर के लिए एक डिफ़ॉल्ट की आपूर्ति कर सकते हैं:

#include <iostream> 
using namespace std; 

template <bool T=true, class U> //"default" from LEFT-most parameter 
void f(U u){ 
    if(T){ cout<<true;} 
    else cout<<false; 
} 
int main() { 
    auto x = [](){ }; 
    f(x); 
    return 0; 
} 

यहां लाइव डेमो देखें।

यदि आप डिफ़ॉल्ट का उपयोग करना चाहते हैं, तो आप डिफ़ॉल्ट रूप से डिफ़ॉल्ट पैरामीटर के दाईं ओर पैरामीटर निर्दिष्ट नहीं कर सकते हैं। हालांकि, आपके उदाहरण में, U को फ़ंक्शन में तर्क के प्रकार से घटाया जा रहा है, और T डिफॉल्ट किया जा रहा है।

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