代码之家  ›  专栏  ›  技术社区  ›  Daniel Langr

SFINAE是否依赖类型推断?

  •  3
  • Daniel Langr  · 技术社区  · 6 年前

    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)

    2 回复  |  直到 6 年前
        1
  •  8
  •   Barry    6 年前

    斯芬娜也能这样用吗?

    对。

    零件 [temp.deduct]/2 )-替换(SFINAE中的s)失败不是错误( [temp.deduct]/8 ).

    T has_value_type_helper ,我们还需要替换 T 在争论中 T::value_type int 没有名为 value_type -这是。。。不是错误,我们只是把候选人排除在考虑范围之外。我们还有另一个候补人选,所以这个很好。

        2
  •  0
  •   Matthieu Brucher    6 年前