2016-03-27 17 views
5

को देखते हुए निम्नलिखित सरल structvariadic टेम्पलेट निर्माता प्राथमिकता

template <typename T> 
struct A 
{ 
    A(T a) {} 

    template <typename ... Ts> 
    A(T a, Ts ... more) {} 
}; 

int main() 
{ 
    A<int> a(1); 
} 

गारंटी नहीं है कि A(T a) variadic टेम्पलेट निर्माता के बजाय बुलाया जाएगा क्या है, और क्यों?

उत्तर

6

मानक आप देख रहे हैं में खंड §14.8.2.4 है

तो एक एक समारोह पैरामीटर पैक से तब्दील किया गया था और पी एक पैरामीटर पैक नहीं है, प्रकार कटौती विफल रहता है। अन्यथा, परिणामी प्रकार पी और ए का उपयोग करके, कटौती 14.8.2.5 में वर्णित अनुसार की जाती है। यदि पी फ़ंक्शन पैरामीटर पैक है, तो फ़ंक्शन पैरामीटर पैक की घोषणाकर्ता-आईडी के प्रकार पी की तुलना में तर्क टेम्पलेट के प्रत्येक शेष पैरामीटर प्रकार का प्रकार ए है। प्रत्येक तुलना फ़ंक्शन पैरामीटर पैक द्वारा विस्तारित टेम्पलेट पैरामीटर पैक में बाद की स्थितियों के लिए टेम्पलेट तर्क को घटाती है। यदि किसी दिए गए प्रकार के लिए कटौती सफल होती है, तो तर्क टेम्पलेट से टाइप को पैरामीटर टेम्पलेट से कम से कम विशिष्ट के रूप में कम से कम माना जाता है।

[उदाहरण:

template<class... Args> void f(Args... args); // #1 
template<class T1, class... Args> void f(T1 a1, Args... args); // #2 
template<class T1, class T2> void f(T1 a1, T2 a2); // #3 
f(); // calls #1 
f(1, 2, 3); // calls #2 
f(1, 2); // calls #3; non-variadic template #3 is more 
// specialized than the variadic templates #1 and #2 

- अंत उदाहरण]

+1

14.8.2.4 को देखने के लिए जो अधिक विशिष्ट है दो समारोह टेम्पलेट्स तुलना के बारे में है। लेकिन इस उदाहरण में उम्मीदवारों में से एक कार्य एक समारोह टेम्पलेट नहीं है। – aschepler

+0

@aschepler आप कह रहे हैं कि कंपाइलर को अब तक यह प्राप्त करने की आवश्यकता नहीं है, क्योंकि एक गैर-टेम्पलेट फ़ंक्शन जो एक परिपूर्ण मिलान है, इसका मतलब है कि इसे टेम्पलेट रिज़ॉल्यूशन शुरू करने की भी आवश्यकता नहीं है। मैं सहमत हूँ। इसमें एक और खंड होगा जो इसे शामिल करता है। –

2

इसी कारण f(const int&)f(const T&) तुलना में एक बेहतर मैच है जब Tint के रूप में निष्कर्ष निकाला जा सकता है: A(int) एक गैर टेम्पलेट समारोह और Ts... खाली सूची के रूप में निष्कर्ष निकाला साथ A(int, Ts...) है एक समारोह टेम्पलेट विशेषज्ञता है।

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