Что SFINAE не работает правильно со следующей функцией has_member?

Я пробую примеры изTMP разговор Уолтера Брауна и я пытаюсь получить егоhas_member реализация работает.

Однако реализация, похоже, ложно возвращает true, что заставляет меня верить, что есть некоторая деталь SFINAE, которую я не понимаю.

#include <iostream>
#include <type_traits>

template <class ...>
using void_t = void;

template <class, class = void>
struct has_type_member: std::false_type {};

template <class T> 
struct has_type_member<T, void_t<typename T::type> >: std::true_type {};

struct FooWithType
{
    typedef int type;
};

struct FooNoType 
{
};

int main()
{
    std::cout << "Does FooWithType have type member? " << 
        (has_type_member<FooWithType>() ? "YES" : "NO") << "\n";

    std::cout << "Does FooNoType have type member? " << 
        (has_type_member<FooNoType>() ? "YES" : "NO") << "\n";

    return 1;                                                                                                                 
}      

Выход:

Does FooWithType have type member? YES
Does FooNoType have type member? YES

Я на GCC 4.8.2 на Ubuntu.

Ответы на вопрос(1)

Ваш ответ на вопрос