提问人:graphitemaster 提问时间:10/19/2014 最后编辑:user2864740graphitemaster 更新时间:3/5/2023 访问量:921
为 SFINAE 测试仪提供默认值为零的原因是什么?
What is the reason for providing a default value of zero for SFINAE testers?
问:
我注意到大部分 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>
{
};
但是,令我感到困惑的是,当他们以 0 显式进行调用时,为什么会出现这种情况。我记得在某处听说过这是一个优化(在实例化模板时加快编译器的速度),但我不完全明白这是如何工作的。我看了一下标准,它有一个部分简要描述了与模板参数推导相关的默认参数会发生什么。
14.8.2
在模板参数推导过程中的某些点上,有必要采用使用模板参数的函数类型,并将这些模板参数替换为相应的模板参数。当任何显式指定的模板参数被替换到函数类型中时,这是在模板参数推导开始时完成的,当从默认参数推导或获取的任何模板参数被替换时,在模板参数推导结束时再次完成。
最后一点听起来与我的问题有关
在模板参数推导结束时,当从默认参数推导或获得的任何模板参数被替换时。
然而,这听起来像是优化的相反,如果它必须做更多的工作。有没有人有任何理由为什么 0 必须在那里,它没有它也能工作,但是 libc++ 中 SFINAE 的每个示例似乎至少明确地将 0 放在那里,即使他们从未在没有参数的情况下调用该函数。
答: 暂无答案
评论
0
...