यह इसलिए होता है क्योंकि अगर आप std::numeric_limits
अंदर एक बार देख ले या दस्तावेज पर एक नज़र डालें तो आपको निम्न
template<class T>
class numeric_limits
{
public:
static constexpr bool is_specialized = false;
static constexpr T min() noexcept;
static constexpr T max() noexcept;
static constexpr T lowest() noexcept;
तरह के तरीकों की घोषणाओं देखेंगे यहाँ के रूप में आप वहाँ कार्यों कि वापसी कर रहे हैं देख सकते हैं T
मूल्य से, और सी ++ मूल्य द्वारा सरणी प्रकार लौटने का समर्थन नहीं करता (Why doesn't C++ support functions returning arrays? देखें)
तो निम्न पंक्ति
संकलन नहीं होगा
std::numeric_limits<char[20]>::is_specialized
और उस के तत्काल संदर्भ में नहीं है सीधे जाँच करने के लिए है कि क्या SFINAE साथ सीधे एक प्रकार के लिए काम करता है is_specialized
संकलन नहीं होगा क्योंकि वहाँ (क्योंकि सरणी प्रकार लौटने जैसा कि ऊपर बताया की) का उत्पादन एक त्रुटि हो जाएगा किसी भी आगे प्रयास नमूना। तो अगर आप अवधारणा है कि std::numeric_limits
के लिए समर्थित है का निरीक्षण करने की आवश्यकता होगी (इस मामले में std::is_arithmetic
)
हालांकि सभी आप इस काम std::decay_t
प्रकार
std::numeric_limits<std::decay_t<char[20]>>::is_specialized
है बनाने के लिए यहाँ क्या करने की जरूरत और अब यह होगा काम करें क्योंकि आपने स्पष्ट रूप से सरणी प्रकार को पॉइंटर में क्षीण कर दिया है और यह फ़ंक्शन से वापस करने योग्य है। आप संभवतः पहले स्थान पर ऐसा करना चाहते थे क्योंकि आप को गैर-क्षय प्रकार के लिए const int&
पर गलती से कॉल करना नहीं चाहते हैं, तो क्या आप एक उदाहरण दे सकते हैं कि आप "पहचान और शाखा" कैसे चाहते हैं? मैं 'char [20]' जैसे निश्चित प्रकार के बजाय टेम्पलेट के अंदर कुछ अनुमान लगा रहा हूं, जिसके लिए हम सभी को जवाब पता है? – aschepler
"पहचान और शाखाकरण" को परिभाषित करें। 'Static_assert' का उद्देश्य वास्तव में, संकलन विफल होने पर संकलन त्रुटि जारी करना है। यदि आपको एक अलग परिणाम की आवश्यकता है, तो आपको यह बताना होगा कि यह क्या है। –