SFINAE检查失败

时间:2018-11-27 16:19:17

标签: c++ templates sfinae

以下SFINAE测试无法检查是否是鸭子(如果有“ void quack()”成员函数,则是鸭子)。我不明白为什么。有什么想法吗?

struct Duck
{
    void quack() {}
};

struct Pig
{
    void groink() {}
};

template<class T>
auto test_duck(const T& t, int)
    -> decltype(t.quack(), bool())
{
    return true;
}

template<class T>
auto test_duck(const T& t, long)
{
    return false;
}

template<class T>
bool is_duck(const T& t)
{
    return test_duck(t, 0);
}    

int main()
{
    Duck duck;
    Pig pig;

    cout << is_duck(duck) << endl;  
    cout << is_duck(pig) << endl;
}

1 个答案:

答案 0 :(得分:1)

问题是您传递的是const Duck&,但是Duck仅具有非常量quack()方法。

编辑:看起来评论已经及时发现了。如果@PiotrSkotnicki要发布答案(而不是在评论中回答),我将其删除。