Аргументы шаблона по умолчанию не участвуют в разрешении перегрузки, поэтому ваши два объявления фактически идентичны.
Вы можете переписать объявление следующим образом:
template <typename T,
std::enable_if_t<std::is_trivially_copyable<T>::value, int> = 0>
inline int test_sfinae(T tc) {
return 1;
}
template <typename T,
std::enable_if_t<!std::is_trivially_copyable<T>::value, int> = 0>
inline int test_sfinae(T ntc) {
return 2;
}
Когда T
тривиальноПри копировании, объявления будут выглядеть следующим образом:
template <typename T, int = 0>
inline int test_sfinae(T tc);
template <typename T, /* Something that does not compile... */ = 0>
inline int test_sfinae(T ntc);
Таким образом, будет выбрана первая перегрузка, и обратная, когда T
не копируется тривиально.