Этот ответ объясняет поведение следующей программы:
template<typename A, typename B = int >
struct FirstWins {
static constexpr int i = 1;
};
template<typename A>
struct FirstWins<A, float/* anything different from int */ > {
static constexpr int i = 2;
};
template<typename A, typename B = int >
struct SecondWins {
static constexpr int i = 1;
};
template<typename A>
struct SecondWins<A, int > {
static constexpr int i = 2;
};
int main()
{
typedef void Whatever_t;
cout << FirstWins < Whatever_t >::i << endl; // prints 1
cout << SecondWins< Whatever_t >::i << endl; // prints 2
return 0;
}
Однако я не могу найти фактическую ссылку, описывающую явно это поведение и тем самым подтверждающую ответ.
Я не смог найти на cppreference.com предложение, подтверждающее, что явные аргументы шаблона предпочтительнее, чем параметры по умолчанию.
Я подозреваю, что это не совсем правило.Правило состоит в том, что всякий раз, когда существует частичная специализация шаблона, соответствующая аргументам шаблона, эта специализация всегда выбирается вместо создания основного шаблона.Это правильно?(в этом случае документы как-то объясняют это правило, но опять же не явно).