Я пытаюсь понять частичную специализацию шаблона с аргументами по умолчанию. Если я удаляю приведение к пустоте в специализации is_comparable, напечатанное значение всегда ложно, в то время как, если я оставлю приведение к (void), все будет работать нормально. Может кто-нибудь объяснить, почему нужен бросок на пустоту? Вероятно, это связано с сопоставлением аргумента шаблона по умолчанию для T3, но я пытаюсь получить здесь некоторые дополнительные сведения о предостережениях с частичной специализацией шаблона и параметрами шаблона по умолчанию.
template<typename T1, typename T2, typename T3 = void>
struct is_comparable
{
static const bool value = false;
};
template<typename T1, typename T2>
struct is_comparable<T1, T2, decltype((void)(std::declval<T1>() == std::declval<T2>()))>
{
static const bool value = true;
};
int main()
{
cout << boolalpha;
cout << is_comparable<int, char>::value << endl;
cout << is_comparable<int, float *>::value << endl;
}
Обновление: я наблюдаю такое же поведение, даже когда используются указатели. Я бы предположил, что частичная специализация будет выбрана в этом случае?
template<typename T1, typename T2, typename T3 = void>
struct is_comparable
{
static const bool value = false;
};
template<typename T1, typename T2>
struct is_comparable<T1*, T2*, decltype((std::declval<T1>() == std::declval<T2>()))>
{
static const bool value = true;
};
int main()
{
cout << boolalpha;
cout << is_comparable<int*, int*>::value << endl;
}