无法使用auto参数True_type来检测T :: value()

时间:2018-07-27 15:34:54

标签: c++ language-lawyer c++17 template-meta-programming sfinae

使用SFINAE,has_value_int<T>has_value_auto<T>都试图检测类T是否具有名为static constexpr的{​​{1}}函数。

  • 使用value参数化inttrue_type适用于 演示类has_value_int<T>pass
  • 使用fail参数化autotrue_type总是返回false。

使用has_value_auto<T>int有什么区别?为什么auto不起作用?

具体来说,为什么重载解析比auto更喜欢match_auto(...)

match_auto(int)

编辑:Compiled using gcc 7.3.0。 与clang works相同。

1 个答案:

答案 0 :(得分:2)

没有区别;这是gcc错误,由Barry报告为#86703

作为一种解决方法,请不要使用函数:

// detect if T::value() is a valid compile-time expression
template <typename T, typename = void> struct match_auto : std::false_type {};

template <typename T>
struct match_auto<T, std::void_t<true_auto<(T::value(), void(), 0)>>>
    : std::true_type {};

template <class T> static constexpr bool has_value_auto = match_auto<T>::value;