C++模板实例化问题

在学习模板时,我遇到了一个问题。
我编写了一个程序,这个程序会在编译期判断一个类中是否存在成员a(不管是不是成员变量)
但是有一个情况令我不能理解。
以下代码:

//is_value_exists获得这个类是否存在a参数
template<class class_name, class = void> struct is_value_exists//当然,如果a不存在肯定是使用缺省的
: public std::false_type { };
template<class class_name> //当a存在时
struct is_value_exists<class_name, 
       decltype(class_name::a) //注意这行代码,问题的出发点
> : public std::true_type { };

template<class class_name> void func() {
 std::cout << is_value_exists<class_name>::value << "\n"; 
}
//测验
class A { }; //Empty class
class B { public: int a; }; //a is public
class C { int a; }; //a is private
int main() {
    func<A>();
    func<B>();
    func<C>();
}

输出了:

0
0
0

这不符合我的预期;
但我将代码改为以下这一行时:

//is_value_exists获得这个类是否存在a参数
template<class class_name, class = void> struct is_value_exists//当然,如果a不存在肯定是使用缺省的
: public std::false_type { };
template<class class_name> //当a存在时
struct is_value_exists<class_name, 
       std::void_t<decltype(class_name::a)> //注意这行代码,问题的出发点
> : public std::true_type { };

template<class class_name> void func() {
 std::cout << is_value_exists<class_name>::value << "\n"; 
}
//测验
class A { }; //Empty class
class B { public: int a; }; //a is public
class C { int a; }; //a is private
int main() {
    func<A>();
    func<B>();
    func<C>();
}

而输出了:

0
1
1

我认为当class_name::a不存在时,他的类型值应为error-type,因此decltype(class_name::a)的结果就不存在,无法进行实例化,之后编译器会寻找其他合适的模板类去实例化。
但结果不符我的想法。当class_name::a存在时,偏特化的类也没有被实例化。而当我加上std::void_t时,却又被实例化了。
这是为什么呢?