当我遇到SFINAE的示例代码时,我正在学习一些C ++习语,我对代码感到困惑。
注意:is_ptr()
没有定义。
我自己编译了代码,没有关于缺少函数定义的编译器错误,为什么?
sizeof()
用于其中一个调用,它显然是在函数返回时执行的,但是再次没有定义。怎么可能?
template <typename T>
struct is_pointer
{
template <typename U>
static char is_ptr(U*);
template <typename X, typename Y>
static char is_ptr(X Y::*);
template <typename U>
static char is_ptr(U (*)());
static double is_ptr(...);
static T t;
enum {value = sizeof(is_ptr(t)) == sizeof(char)};
};
答案 0 :(得分:4)
sizeof
是所谓的未评估上下文。在其中,表达式只需要很好地形成,实际上什么都不会被执行。因此,只需声明的函数可以在内部使用而无需实际定义。
这是因为不需要定义来确定类型信息。在这种情况下,ADL选择的重载是有问题的类型信息。它的返回类型也可以从声明中获得。