这是一个例子:
extern const int b; templatevoid f(int); template void f(long); template void g() { f<0, b>(0); } // #1 extern const int b = 0; int main(){ g (); } // #2
在#1处的假设实例化将调用void f<0, b>(long)
,因为此时b
不是常量表达式,所以(int)
重载SFINAE消失了。#2处的实例化(这是的实例化点g
)将调用void f<0, 0>(int)
,因为到那时b
是一个常量表达式,(int)
重载是可行的,并赢得了重载解决方案。
Clang和GCC实际上将f
使用此代码调用不同的。
这是一个例子:
extern const int b; templatevoid f(int); template void f(long); template void g() { f<0, b>(0); } // #1 extern const int b = 0; int main(){ g (); } // #2
在#1处的假设实例化将调用void f<0, b>(long)
,因为此时b
不是常量表达式,所以(int)
重载SFINAE消失了。#2处的实例化(这是的实例化点g
)将调用void f<0, 0>(int)
,因为到那时b
是一个常量表达式,(int)
重载是可行的,并赢得了重载解决方案。
Clang和GCC实际上将f
使用此代码调用不同的。