它为什么有效? SFINAE

时间:2011-03-05 15:33:55

标签: c++ sfinae

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?

};

请参阅代码中的评论。

1 个答案:

答案 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};