SFINAE是否取决于类型推断?



我对 cppreference.com 中的以下引用感到困惑:

此规则在函数模板的重载解析期间适用:当将推导类型替换为模板参数失败时,将从重载集中丢弃专用化,而不是导致编译错误。

这是否意味着没有类型推导就无法工作?例如,请考虑以下代码:

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都可以这样使用吗?

甚至可以这样使用SFINAE吗?

是的。

替换是扣除过程的一部分。显式提供模板参数并不能消除替换的需要([temp.deduc]/2( - 替换(SFINAE 中的 S(失败不是错误 ([temp.deduc]/8(。

在这种情况下,当你显式提供Thas_value_type_helper时,我们仍然需要将T代入参数T::value_type。这是在替换的直接上下文中,因此如果替换失败 - 对于没有名为value_type的嵌套类型别名的int类型,它会失败 - 它是......不是错误,我们只是将候选人从考虑中删除。我们还有另一个备份候选项,所以这工作正常。

这里没有"真正的"类型推导,因为您直接指定了类型。但是 sfinae 仍然在这里工作,因为编译器会推断出在实例化模板时需要使用什么。

相关内容

  • 没有找到相关文章

最新更新