Line 1: Choosing the partial specialization below if the test succeeds.
Line 2: int T::*
is only valid if T
is a class type, as it denotes a member pointer.
As such, if it is valid, void_<T>::type
yields void
, having this partial specialization chosen for the instantiation with a value
of true
.
If T
is not of class type, then this partial specialization is out of the picture thanks to SFINAE and it defaults back to the general template with a value
of false
.
Everytime you see a T::SOMETHING
, if SOMETHING
isn't present, be it a type, a data member or a simple pointer definition, you got SFINAE going.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…