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)
在此之前感谢您帮助理解这个非常有趣的现象.
由于存在test-function 声明,因此无法获得编译器错误.
您无法获取链接器错误,因为您没有调用 test -function.
C++ Standart ISO/IEC 14882:2003(E)
5.3.3尺寸
sizeof运算符产生其操作数的对象表示中的字节数.操作数是表达式(未计算)或带括号的type-id.sizeof运营商不得......
...
我假设你是在引用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)