Этот шаблон просто не работает для функций преобразования.Проблема в том, чтобы определить, можно ли a
преобразовать в int
, мы ищем operator int()
, но получаем:
std::enable_if_t<std::is_same<std::decay_t<T>, int>{}, int>
Это не выводимый контекст, поэтомумы не находим int
.
Вы должны переместить условие в параметр по умолчанию:
template <typename T, std::enable_if_t<std::is_same_v<T, int>, int> = 0>
constexpr explicit operator T() const noexcept { return -1; }
Таким образом, мы можем вывести T
и затем позволить SFINAE выполнить егомагия.Обратите внимание, что вам не нужно decay
, поскольку у нас нет ссылок.