如何选择部分模板专业化?

How partial template specialization chosen?

请解释一下模板专业化选择的规则。我有一个例子:

template<typename T1, typename T2 = int>
struct S : false_type{};

template<typename T>
struct S<T, float> : true_type{};

cout << boolalpha << S<float>::value;

为什么输出是false?一般来说,默认模板参数 typename T2 = int 在专用 类 中会发生什么情况?有没有影响?

选择模板专业化分为五个步骤:

  1. 采用主模板声明。 (<T1, T2 = int> S)
  2. 填写用户指定的模板参数。 (T1 <- float)
  3. 仅限函数模板:推导额外的模板参数。
  4. 对剩余的模板参数使用默认值。 (T2 <- int)
  5. 使用偏序算法(C++14 14.5.6.2)选择最匹配的特化。 (<float, int> 不匹配 <T, float>,所以忽略专业化;唯一的可能性是主模板)