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

How is class function without definition not causing error

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

注意:is_ptr()没有定义。

  1. 我自己编译的代码,没有出现函数定义不足的编译错误,为什么?

  2. sizeof() 用于其中一个调用,它显然是在函数的 returns 上执行的,但话又说回来,没有定义。怎么可能?

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

sizeof 就是所谓的未评估上下文。在其中,表达式只需要格式正确,实际上什么都不会执行。所以只声明的函数可以在内部使用而不需要实际定义。

这是因为不需要定义来确定类型信息。在这种情况下,ADL 选择的重载是相关的类型信息。它的 return 类型也可以单独从声明中获得。