सी ++ मानक 14.8.2 $ 7 का कहना है कि:प्रतिस्थापन टेम्पलेट तर्क कटौती में कैसे काम करता है?
प्रतिस्थापन सभी प्रकार के और भाव कि समारोह प्रकार में और टेम्पलेट पैरामीटर घोषणाओं में उपयोग किया जाता है में होता है। अभिव्यक्तियों में न केवल निरंतर अभिव्यक्तियां होती हैं जो कि सरणी सीमाओं में दिखाई देती हैं या नॉनटाइप टेम्पलेट तर्क के रूप में दिखाई देती हैं, लेकिन
sizeof
,decltype
के अंदर सामान्य अभिव्यक्तियों (यानी गैर-निरंतर अभिव्यक्ति), और अन्य संदर्भ जो गैर-निरंतर अभिव्यक्तियों को अनुमति देते हैं। प्रतिस्थापन शब्दावली क्रम में आता है और जब ऐसी स्थिति में कटौती का कारण बनता है तो विफल रहता है। [नोट: अपवाद विनिर्देशों में समकक्ष प्रतिस्थापन तभी किया जाता है जब अपवाद-विनिर्देश तत्काल हो जाता है, जिस पर प्रतिस्थापन एक अमान्य प्रकार या अभिव्यक्ति में परिणामस्वरूप एक प्रोग्राम खराब हो जाता है। - अंत टिप्पणी]
मानक यहाँ एक उदाहरण देता है:
template <class T> struct A { using X = typename T::X; };
template <class T> typename T::X f(typename A<T>::X);
template <class T> void f(...) { }
template <class T> auto g(typename A<T>::X) -> typename T::X;
template <class T> void g(...) { }
void h() {
f<int>(0); // OK, substituting return type causes deduction to fail
g<int>(0); // error, substituting parameter type instantiates A<int>
}
क्यों बुला g<int>(0)
एक त्रुटि यहाँ है? क्या पिछला-वापसी-प्रकार T::X
प्रतिस्थापन विफलता का कारण नहीं है? टेम्पलेट फ़ंक्शन f
और g
के बीच क्या अंतर है?
रिटर्न प्रकार फ़ंक्शन हस्ताक्षर के हिस्से के रूप में कैसे गिना जाता है लेकिन पैरामीटर नहीं? – Barry
@ बैरी मुझे लगता है कि दोनों रिटर्न प्रकार और पैरामीटर को फ़ंक्शन हस्ताक्षर – Carousel
@ बैरी के हिस्से के रूप में माना जाता है। वे फ़ंक्शन टेम्पलेट के हस्ताक्षर का हिस्सा हैं, लेकिन मुझे शायद "हस्ताक्षर" का उपयोग नहीं करना चाहिए। –