【问题标题】:Does SFINAE depend on type deduction?SFINAE 是否依赖于类型扣除?
【发布时间】:2018-10-04 15:24:03
【问题描述】:

我对@9​​87654321@ 中的以下引用感到困惑:

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

这是否意味着 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&lt;T&gt;(nullptr) 中明确提供。连SFINAE都可以这样用吗?

【问题讨论】:

    标签: c++ sfinae type-deduction template-argument-deduction


    【解决方案1】:

    SFINAE 也可以这样用吗?

    是的。

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

    在这种情况下,当您将T 显式提供给has_value_type_helper 时,我们仍然需要将T 替换为参数T::value_type。那是在替换的直接上下文中,所以如果替换失败 - 对于像 int 这样没有名为 value_type 的嵌套类型别名的类型 - 它......不是错误,我们只是删除考虑的候选人。我们有另一个后备候选人,所以这很好。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2013-06-12
        • 1970-01-01
        • 2016-12-21
        • 2017-03-09
        • 2016-06-18
        • 2014-07-20
        • 2019-09-19
        • 2021-02-21
        • 1970-01-01
        相关资源
        最近更新 更多