我无法弄清楚为什么会这样。问题和意见是内联的。
using DefaultType_t = void;
template<typename...>
using void_t = DefaultType_t;
template<typename T>
struct is_float;
template<>
struct is_float<float> {
using type = float;
};
template<typename T>
using is_float_t = typename is_float<T>::type;
template<typename , typename = DefaultType_t>
struct A {
A() {std::printf("\nCalled 0\n");}
};
template<class T>
struct A<T, void_t<is_float_t<T>>> {
A() {std::printf("\nCalled 1\n");}
};
int main() {
is_float_t<float> {}; // Works fine ------\\
// ==> I understand these two cases.
is_float_t<int> {}; // Compile Error ---//
A<int> {}; // Prints Called 1 <Q> Why does this not Print Called 0 ??
// Because is_float_t<int> is erroneous,
// so shouldn't SFINAE apply ?
}
再次提出问题:A<int> {};
为什么不打印Called 0
? A<AnyType>
首先会从基本模板中选择默认模板参数,在这种情况下恰好是DefaultType_t
。然后它会尝试查找是否有更专业的版本。据我所知,没有,因为专门的第二个模板参数格式错误,因为is_float_t<int>
格式不正确。所以它应该选择基础。否?
使用GCC/G++ 4.8.2
Ubuntu 14.04 {64 bits}
上的-std=c++11
和{{1}}