7

参考昨天的帖子,今天早上把我吵醒了。为什么这实际上有效?就函数test而言,这个函数没有主体,它怎么能做任何事情呢?我想知道这是为什么以及如何工作的?我真的很想看到你的答案。

template<typename T> 
class IsClassT { 
  private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(int C::*); //NO BODY HERE
    template<typename C> static Two test(…); //NOR HERE
  public: 
    enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One) }; 
    enum { No = !Yes }; 
}; 

提前感谢帮助了解这个非常有趣的现象。

4

2 回答 2

8
  1. 你不能得到编译器错误,因为test-function声明存在。

  2. 你不能得到链接器错误,因为你没有调用 test-function。

C++ 标准 ISO/IEC 14882:2003(E)

5.3.3 大小

sizeof 运算符产生其操作数的对象表示中的字节数。操作数要么是一个未计算的表达式,要么是一个带括号的类型 ID。sizeof 运算符不得...

...

于 2010-03-17T11:40:35.673 回答
6

我假设您指的是 Yes 枚举? IsClassT<T>::test<T>(0)? sizeof 实际上并不评估其参数。这就是为什么像下面这样的代码是合法的,即使你可能期望它会拯救你:

int* p = 0;
int sizeof_int = sizeof(*p); //oops, p is 0 :(
于 2010-03-17T11:07:39.417 回答