SFINAE受哪些规范性规则约束?其C++标准规范性引用是什么?
SFINAE的规范性规则与标准引用
SFINAE(Substitution Failure Is Not An Error)的核心行为由C++标准中模板实参推导相关的规范性条款约束,标准从未直接使用“SFINAE”这一术语,但以下规则构成了该技术的基础:
核心规则
- 在函数模板的重载决议阶段,当对模板参数进行实参替换时,若替换产生无效的类型或表达式,且该替换发生在直接上下文中,这种失败不会触发编译错误,而是将该函数模板从重载候选集中排除,继续进行其他候选的决议。
关键规范性引用
模板实参推导的失败处理
以C++20标准为例,[temp.deduct]/8条款明确:若模板实参替换导致无效的类型或表达式,且该情况处于替换的直接上下文,则该模板不会被加入重载候选集;若替换发生在非直接上下文(如默认模板实参、嵌套类定义等),则属于编译错误。
直接上下文的界定
标准条款[temp.deduct]/9定义了直接上下文的范围,包括:- 函数模板的参数列表、返回类型
- 模板参数声明的约束条件
- C++20及以后的函数模板
requires子句 - 用于推导模板实参的表达式中的类型与表达式
补充说明
你提到的__cpp_lib_result_of_sfinae宏仅属于标准库的特性版本标记,用于标识<functional>、<type_traits>等头中result_of(及后续的invoke_result)组件已实现基于SFINAE的行为,并非语言层面SFINAE规则的定义。
内容的提问来源于stack exchange,提问作者dfrib
相关产品推荐
相关产品推荐

