Deduce karo T = std::vector<int>. Kyun?const T& ke against argument matching.
Signature mein substitute karo → return type ban jaata hai std::vector<int>::value_type = int. Valid hai → candidate remain karta hai.
Ab first(42) call karo jahan 42int hai:
Deduce karo T = int.
Return type mein substitute karo: int::value_type. int ka koi member value_type nahi hai → substitution failure.
SFINAE: yeh candidate silently drop ho jaata hai. Agar koi doosra overload exist nahi karta → error "no matching function" (NOT "int has no value_type").
Socho ek job interview hai jahan boss ke paas résumés (candidate functions) ka stack hai. Har résumé ke liye woh header padhta hai (naam, skills = signature). Agar header bakwaas hai ("Main Mars pe ud sakta hoon"), toh boss poora interview band nahi karta — woh bas woh résumé bin mein phenk deta hai aur agla padhta hai. SFINAE bilkul yahi hai: toota hua header résumé ko silently trash karwa deta hai. Lekin agar header theek lagta hai aur sirf interview ke andar woh banda bakwaas bolta hai (function body toot jaati hai) — tab boss furious ho jaata hai aur poori cheez crash ho jaati hai. Toh: toota header = quietly skip; andar toota = real error.
Substitution Failure Is Not An Error — agar template args ko function ki signature mein substitute karne se invalid type/expression bane, toh woh candidate overload resolution se silently remove ho jaata hai, hard error nahi aata.
SFINAE apply hone ke liye substitution failure kahan honi chahiye?
Signature ke immediate context mein (return type, parameter types, template parameter defaults) — function body mein NAHI.
Agar failure signature ki jagah function body mein ho toh kya hota hai?
Yeh HARD compile error hai; SFINAE wahan protect nahi karta.
std::enable_if<false, T>::type kya deta hai?
Kuch nahi — primary template ka koi ::type nahi hai, isliye ise name karna substitution failure hai jo overload drop kar deta hai.