2015-11-13 12 views
8

सी ++ 11 introduced फ़ंक्शन टेम्पलेट्स के लिए डिफ़ॉल्ट टेम्पलेट तर्क। Default template arguments for function templates भी देखें।फंक्शन टेम्पलेट्स के लिए गैर-अंतिम डिफ़ॉल्ट टेम्पलेट तर्क

लेकिन सी ++ मानक पढ़ना मुझे नहीं पता था कि एक फ़ंक्शन टेम्पलेट को परिभाषित करना कानूनी है जो पहले टेम्पलेट तर्क के लिए डिफ़ॉल्ट टेम्पलेट तर्क का उपयोग करता है, लेकिन अन्य टेम्पलेट तर्क नहीं।

यह default arguments के विपरीत होगा, जहां सभी अनुवर्ती पैरामीटरों को एक डिफ़ॉल्ट तर्क दिया जाना चाहिए; या एक फ़ंक्शन पैरामीटर पैक बनें।

डिफ़ॉल्ट तर्क और डिफ़ॉल्ट टेम्पलेट तर्क के बीच का अंतर एक पहली नजर में अजीब लगता है, लेकिन जैसा कि निर्माणों के लिए अनुमति देता है:

template <typename TException = std::exception, typename TObjectBuilder> 
auto SwallowExceptions(const TObjectBuilder& rObjectBuilder) -> decltype(rObjectBuilder()) 
{ 
    try 
    { 
     return rObjectBuilder(); 
    } 
    catch (const TException&) 
    { 
     return decltype(rObjectBuilder())(); 
    } 
} 

इस कानूनी सी ++ कोड और जहां मानक में है यह पाया जा सकता है?

उत्तर

8

मैं एक सीधा बोली जो यह अनुमति देता है नहीं देख सकते हैं, लेकिन यह निश्चित चूक द्वारा अनुमति दी है:

N3337 [temp.param]/11:एक वर्ग टेम्पलेट या अन्य नाम टेम्पलेट की एक टेम्पलेट पैरामीटर एक डिफ़ॉल्ट टेम्पलेट तर्क है , प्रत्येक बाद के टेम्पलेट-पैरामीटर में या तो एक डिफ़ॉल्ट टेम्पलेट-तर्क दिया जाएगा या टेम्पलेट पैरामीटर पैक होगा। यदि प्राथमिक वर्ग टेम्पलेट या उपनाम टेम्पलेट का टेम्पलेट-पैरामीटर टेम्पलेट पैरामीटर पैक है, यह अंतिम टेम्पलेट-पैरामीटर होगा। फ़ंक्शन टेम्पलेट का टेम्पलेट पैरामीटर पैक नहीं होगा, उसके बाद एक और टेम्पलेट पैरामीटर तब तक जब तक कि टेम्पलेट पैरामीटर को घटाया जा सके या डिफ़ॉल्ट तर्क (14.8.2) हो।

तो यह कक्षा टेम्पलेट्स और उपनाम टेम्पलेट्स के लिए अस्वीकृत है, लेकिन फ़ंक्शन टेम्पलेट्स के लिए अनुमति दी गई है क्योंकि डिफ़ॉल्ट वाले वाले पैरामीटर फ़ंक्शन तर्क से घटाए जा सकते हैं।

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