所以我正在进行基于this question的进一步测试,而且我还不清楚类型推导是如何工作的。
如果我使用以下内容:
template<typename T, std::enable_if_t<std::is_same<T,int>::value, int> = 0>
inline auto fnx(T) -> int
{
return 0;
}
template<typename T, std::enable_if_t<std::is_same<T, float>::value, int> = 0>
inline auto fnx(T) -> int
{
return 0;
}
inline void fn()
{
fnx(1);
fnx(1.f);
}
我没有编译错误。 但是当我这样做时:
template <bool TRUTH>
constexpr bool value() { return TRUTH; }
template<typename T, std::enable_if_t<value<std::is_same<T,int>::value>(), int> = 0>
inline auto fnx(T) -> int
{
return 0;
}
template<typename T, std::enable_if_t<value<std::is_same<T, float>::value>(), int> = 0>
inline auto fnx(T) -> int
{
return 0;
}
inline void fn()
{
fnx(1);
fnx(1.f);
}
类型扣除失败。这里发生了什么?为什么要通过constexpr
函数使其无效?或者这是我的c ++编译器的问题?我正在使用VC ++ 2015。
错误是:
error C2672: 'detail::fnx': no matching overloaded function found
error C2783: 'int detail::fnx(T)': could not deduce template argument for '__formal'
note: see declaration of 'detail::fnx'
答案 0 :(得分:2)
这是您的Visual Studio版本中的错误。 尝试升级到2017年。
我could not reproduce与19.00.23506
请注意,gcc 7.0.1和Clang 5.0.0没有问题。
答案 1 :(得分:2)
您的代码很好,完全有效。但是,您必须不使用constexpr函数与Visual Studio 2015进行SFINAE。您可以在此处阅读有关MSVC中表达式SFINAE的更多信息:Expression SFINAE improvements in VS 2017 RC
升级到2017将解决您的问题。