指昨天的帖子,
这让我今天早上醒了。为什么这实际上有效?只要涉及函数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 };
};
提前感谢您帮助理解这个非常有趣的现象。
答案 0 :(得分:8)
由于存在test
- 函数声明,因此无法获得编译器错误。
由于不致电 test
- 函数,您无法收到链接器错误。
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 :(