class 没有定义的函数如何不会导致错误
How is class function without definition not causing error
我正在学习一些 C++ 习语,当我遇到 SFINAE 的示例代码时,我对代码感到困惑。
注意:is_ptr()
没有定义。
我自己编译的代码,没有出现函数定义不足的编译错误,为什么?
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 类型也可以单独从声明中获得。
我正在学习一些 C++ 习语,当我遇到 SFINAE 的示例代码时,我对代码感到困惑。
注意:is_ptr()
没有定义。
我自己编译的代码,没有出现函数定义不足的编译错误,为什么?
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 类型也可以单独从声明中获得。