没有定义的类函数如何不会导致错误

时间:2017-08-28 06:47:12

标签: c++ templates metaprogramming sfinae

当我遇到SFINAE的示例代码时,我正在学习一些C ++习语,我对代码感到困惑。

注意:is_ptr()没有定义。

  1. 我自己编译了代码,没有关于缺少函数定义的编译器错误,为什么?

  2. 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)};
    };
    

1 个答案:

答案 0 :(得分:4)

sizeof是所谓的未评估上下文。在其中,表达式只需要很好地形成,实际上什么都不会被执行。因此,只需声明的函数可以在内部使用而无需实际定义。

这是因为不需要定义来确定类型信息。在这种情况下,ADL选择的重载是有问题的类型信息。它的返回类型也可以从声明中获得。