这不是一个有效的SFINAE案例和原因

时间:2014-11-01 07:19:48

标签: c++11 gcc4.8

我无法弄清楚为什么会这样。问题和意见是内联的。

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 0A<AnyType>首先会从基本模板中选择默认模板参数,在这种情况下恰好是DefaultType_t。然后它会尝试查找是否有更专业的版本。据我所知,没有,因为专门的第二个模板参数格式错误,因为is_float_t<int>格式不正确。所以它应该选择基础。否?

使用GCC/G++ 4.8.2 Ubuntu 14.04 {64 bits}上的-std=c++11和{{1}}

0 个答案:

没有答案