求C++17及后续标准中SFINAE的明确原文表述
C++17标准
[temp.over]第7段
若模板参数推导失败,或函数模板特化并非可行函数(见[over.match.viable]),则该函数模板特化会从重载候选函数集中被排除。
[temp.deduct]第8段(SFINAE核心基础表述)
若替换模板参数时导致类型或表达式无效,且该无效情况处于函数类型、其模板参数类型以及其显式说明符的直接上下文之中,则模板参数推导失败。[注:替换后的类型和表达式求值可能会产生诸如类模板特化或函数模板特化实例化、隐式定义函数生成等副作用。此类副作用不在直接上下文范围内,可能会导致程序格式错误。——结束注]
C++20标准
[temp.over]第6段
若出现以下情况,函数模板特化会从重载候选函数集中被排除:
(6.1) 针对该模板的参数推导失败,或
(6.2) 该函数模板特化并非可行函数(见[over.match.viable])。
[temp.deduct]第10段
若所有候选模板的推导均失败,则程序格式错误。否则,为每个候选确定的模板参数会代入其函数类型。[...] 若代入后产生无效类型或表达式,则模板参数推导失败。[...] 若模板参数代入函数类型或模板参数列表失败,则函数模板特化并非可行函数。
C++23标准
[temp.over]第6段
若出现以下情况,函数模板特化会从重载候选函数集中被排除:
(6.1) 针对该模板的参数推导失败,或
(6.2) 该函数模板特化并非可行函数(见[over.match.viable])。
[temp.deduct]第12段
若代入后产生无效类型或表达式,则模板参数推导失败。[...] 仅当无效类型或表达式处于函数类型、其模板参数类型以及其显式说明符的直接上下文之中时,才会导致推导失败。[注:替换后的类型和表达式求值可能会产生诸如类模板特化或函数模板特化实例化、隐式定义函数生成等副作用。此类副作用不在直接上下文范围内,可能会导致程序格式错误。——结束注]
内容的提问来源于stack exchange,提问作者J L

