Меня смущает следующая цитата в cppreference.com :
Это правило применяется при разрешении перегрузки шаблонов функций: при замене выведенного типа из-за сбоя параметра шаблона специализация отбрасывается из набора перегрузки, а не вызывает ошибку компиляции.
Означает ли это, что SFINAE не может работать без вывода типа?Например, рассмотрим следующий код:
template <typename T> std::true_type has_value_type_helper(typename T::value_type*);
template <typename> std::false_type has_value_type_helper(...);
template <typename T> inline constexpr bool has_value_type_v
= decltype(has_value_type_helper<T>(nullptr))::value;
int main() {
std::cout << has_value_type_v<int> << std::endl;
std::cout << has_value_type_v<std::vector<int>> << std::endl;
}
Он работает, как и ожидалось, но, насколько я вижу, вычета типов нет.Аргумент шаблона указан явно в has_value_type_helper<T>(nullptr)
.Может ли даже SFINAE использоваться таким образом?