2016-11-28 5 views
9

यह this प्रश्न पर एक फॉलो-अप है।विशेषज्ञताओं के मामले में खराब गठित कार्यक्रमों के कारण गार्ड पैरामीटर पैक की जांच की जाती है?

#include <type_traits> 

template<typename T, typename... P, typename U = std::enable_if_t<std::is_integral<T>::value>> 
void f() { static_assert(sizeof...(P) == 0, "!"); } 

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

यह कम्पाइल, लेकिन [temp.res]/8 के अनुसार यह कोई निदान आवश्यक बीमार का गठन है, की वजह से:

एक variadic टेम्पलेट के हर वैध विशेषज्ञता एक आवश्यकता है

निम्नलिखित कोड पर विचार करें खाली टेम्पलेट पैरामीटर पैक

अब इस थोड़ा अलग उदाहरण पर विचार करें:

#include <type_traits> 

template<typename T, typename... P, typename U = std::enable_if_t<std::is_integral<T>::value>> 
void f() { static_assert(sizeof...(P) == 0, "!"); } 

template<> 
void f<int, int>() { } 

int main() { 
    f<int, int>(); 
} 

इस मामले में एक वैध पूर्ण स्पष्ट विशेषज्ञता मौजूद है जिसके लिए पैरामीटर पैक खाली नहीं है।
क्या यह कहना पर्याप्त है कि कोड अब बीमार नहीं है?


नोट: मैं वापसी प्रकार या इसी तरह के std::enable_if_t रखने जैसा वैकल्पिक तरीकों के लिए नहीं देख रहा हूँ।

+1

आप कह रहे हैं कि 'static_assert' 'f' फ़ंक्शन टेम्पलेट विशेषज्ञता ** अमान्य **' sizeof ... (पी)! = 0' के मामले में बनाता है? बहुत दिलचस्प सवाल! –

+0

@ डब्ल्यूएफ। हाँ। जुड़े प्रश्न में पहले उदाहरण के लिए विवरण शामिल हैं। मैं खुश हूँ कि आपको यह पसंद है। :-) – skypjack

उत्तर

4

[temp.res]/8 टेम्पलेट-घोषणा एस के बारे में वार्ता, इकाई नहीं। यही है, यह प्राथमिक टेम्पलेट्स और आंशिक विशेषज्ञता व्यक्तिगत रूप से के बारे में बात करता है; इन "टेम्पलेट्स" को प्रत्येक नियमों के अधीन एक वैध विशेषज्ञता होना चाहिए। अन्यथा, उस पैराग्राफ में पहली बुलेट को उसी तरीके से व्याख्या करना होगा, जो निश्चित रूप से इसका इच्छित अर्थ नहीं देता है।

template <typename T> 
void f() {T+0;} // wouldn't be allowed to diagnose this, because there could be an 
       // explicit specialization that doesn't contain this statement...? 
+0

वास्तव में दिलचस्प है। मैं एक बार फिर मानक को देख लूंगा। आपका बहुत बहुत धन्यवाद। – skypjack

+0

चलो अब तक नहीं जाते हैं। 'टेम्पलेट शून्य एफ() {1 + nullptr; } 'यह करेगा। और मेरा मानना ​​है कि आपका उदाहरण वास्तव में निदान नहीं किया जा सकता है क्योंकि 'एफ ()' मान्य है :) –

+0

@ टी.सी. क्या यह? प्रारंभकर्ता को [expr.type.conv]/3 द्वारा शासित किया जाता है, जो संदर्भ वाक्यांशों को इसके वाक्यांश द्वारा रोकता है; और/2 संदर्भ प्रकारों को '() 'प्रारंभकर्ता के लिए स्पष्ट रूप से रोकता है, जिससे यह लगातार लगता है। मैं यह भी नहीं देखता कि आप कैसे एक लालू संदर्भ बना सकते हैं और इसे एक प्रबल के रूप में उपज सकते हैं। – Columbo

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