文章目录
在函数模板的重载决议中应用此规则:当将模板形参替换为显式指定的类型或推导的类型失败时,从重载集中丢弃这个特化,而非导致编译失败。 此 特 性 被 用 于 模 板 元 编 程 。 \color{red}此特性被用于模板元编程。 此特性被用于模板元编程。
SFINAE(substitution failure is not an erro)
SFINAE是英文Substitution failure is not an error的缩写,意思是 匹 配 失 败 不 是 错 误 \color{red}匹配失败不是错误 匹配失败不是错误。
这句话什么意思呢?当调用模板函数时编译器会根据传入参数推导最合适的模板函数,在这个推导过程中如果某一个或者某几个模板函数推导出来是编译无法通过的,只要有一个可以正确推导出来,那么那几个推导得到的可能产生编译错误的模板函数并不会引发编译错误。这段话很绕,我们接下来用代码说明一下,一看便知。
选择函数的正确编译版本,“忽略”错误的版本
struct Test {
typedef int foo;
};
template <typename T>
void f(typename T::foo) {
} // Definition #1
template <typename T>
void f(T) {
} // Definition #2
int main() {
f&