为SFINAE测试人员提供默认值为零的原因是什么?

gra*_*ter 11 c++ templates sfinae c++11 libc++

我注意到很多boost和libc ++/libstdc ++在代码中明确地为SFINAE提供了一个默认值零

// libc++ http://llvm.org/svn/llvm-project/libcxx/trunk/include/memory
namespace __has_pointer_type_imp
{
    template <class _Up> static __two __test(...);
    template <class _Up> static char __test(typename _Up::pointer* = 0);
}

template <class _Tp>
struct __has_pointer_type
    : public integral_constant<bool, sizeof(__has_pointer_type_imp::__test<_Tp>(0)) == 1>
{
};
Run Code Online (Sandbox Code Playgroud)

然而,当我们明确地用0调用它时,为什么会出现这种情况让我感到困惑.我记得听到某个地方它是一个优化(在实例化模板时加速编译器)但我不完全理解它是如何工作的.我查看了标准,它有一个部分简要描述了与模板参数推导相关的default-arguments会发生什么.

14.8.2

在模板参数推导过程中的某些点,有必要采用一个使用模板参数的函数类型,并用相应的模板参数替换这些模板参数.当任何显式指定的模板参数被替换为函数类型时,这在模板参数推导的开始处完成,并且当替换从默认参数推导或获得的任何模板参数时,再次在模板参数推断的结尾处完成.

最后一点听起来与我的问题有关

并且在模板参数推断结束时再次替换从默认参数推导或获得的任何模板参数.

然而,如果必须做更多工作,这听起来与优化相反.有没有人有任何理由为什么0必须在那里,它没有它工作,但libc ++中的每个SFINAE例子至少似乎明确地把0放在那里,即使他们从不调用没有参数的函数.