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

The*_* do 7 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 }; 
}; 
Run Code Online (Sandbox Code Playgroud)

在此之前感谢您帮助理解这个非常有趣的现象.

Ale*_*tov 8

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

  2. 您无法获取链接器错误,因为您没有调用 test -function.

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

5.3.3尺寸

sizeof运算符产生其操作数的对象表示中的字节数.操作数是表达式(未计算)或带括号的type-id.sizeof运营商不得......

...


Den*_*ose 6

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

int* p = 0;
int sizeof_int = sizeof(*p); //oops, p is 0 :(
Run Code Online (Sandbox Code Playgroud)

  • 因为返回类型在编译时是没有正文的.它只是一个`char`或`char [2]`.这就是所有编译器的需求,并且它受到标准的批准.要清楚,`sizeof`适用于函数的返回值(不是,例如,函数的代码大小),并且计算您只需要知道类型,而不是具有该类型的实际对象. (7认同)