为什么会这样(模板,SFINAE)。 C ++

时间:2010-03-17 10:58:59

标签: c++ templates sfinae

指昨天的帖子, 这让我今天早上醒了。为什么这实际上有效?只要涉及函数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 }; 
}; 

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

2 个答案:

答案 0 :(得分:8)

  1. 由于存在test - 函数声明,因此无法获得编译器错误。

  2. 由于不致电 test - 函数,您无法收到链接器错误。

  3. C ++ Standart ISO / IEC 14882:2003(E)

      

    5.3.3尺寸

         

    sizeof运算符产生的字节数   对象表示其操作数。   操作数是表达式,   哪个未评估,或者a   带括号的type-id。的大小   经营者不得......

         

    ...

答案 1 :(得分:6)

我假设你是在引用Yes枚举? IsClassT<T>::test<T>(0)? sizeof实际上并没有评估它的参数。这就是为什么像下面这样的代码是合法的,即使你可能希望它可以拯救你:

int* p = 0;
int sizeof_int = sizeof(*p); //oops, p is 0 :(