template<class T, class U>
struct is_convertible
{
typedef char yes;
typedef struct
{char _[2];}no;
static yes test(U);
static no test(...);
enum {value = (sizeof(test(0)) == sizeof(yes)) ? 1 : 0};
//THE PART I'M INTERESTED IN IS (test(0)). Why 0 (zero) works here?
};
请参阅代码中的评论。
答案 0 :(得分:5)
代码在符合规范时“有效”。
此代码不符合函数名称所暗示的规范,并且没有给出更清晰的规范。
目前,当is_convertible<T, U>::value
可复制且U
来自struct is_convertible
的上下文中存在隐式转换或任何指向{{1}的指针时,代码会产生int
为真如果U
不是可复制构造的,则可能无法编译,否则为false。
基于名称和现有代码的组合,假设的规范是U
如果is_convertible<T, U>::value
是可复制构造的(在U
的上下文中)并且struct is_convertible
类型T
的值可隐式转换(在struct is_convertible
的上下文中)到U
。
要使代码符合隐含的规范,需要稍作修改:
enum {value = (sizeof(test(*(T*)0)) == sizeof(yes)) ? 1 : 0};