СФИНАЕ провалил проверку - PullRequest
0 голосов
/ 27 ноября 2018

следующий тест 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 голосов
/ 27 ноября 2018

Проблема в том, что вы передаете const Duck&, но Duck имеет только неконстантный метод quack().

Редактировать: похоже, комментарии уже выяснили это вовремя.Если @PiotrSkotnicki хочет опубликовать ответ (вместо того, чтобы отвечать в комментариях), я удалю это.

...