使用SFINAE,has_value_int<T>
和has_value_auto<T>
都试图检测类T
是否具有名为static constexpr
的{{1}}函数。
value
参数化int
,true_type
适用于
演示类has_value_int<T>
和pass
。fail
参数化auto
,true_type
总是返回false。使用has_value_auto<T>
和int
有什么区别?为什么auto
不起作用?
具体来说,为什么重载解析比auto
更喜欢match_auto(...)
?
match_auto(int)
编辑:Compiled using gcc 7.3.0。 与clang works相同。
答案 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;