使用constexpr功能时扣减失败?

时间:2017-03-15 13:33:34

标签: c++ visual-studio-2015 c++14

所以我正在进行基于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'

2 个答案:

答案 0 :(得分:2)

这是您的Visual Studio版本中的错误。 尝试升级到2017年。

could not reproduce与19.00.23506

请注意,gcc 7.0.1Clang 5.0.0没有问题。

答案 1 :(得分:2)

您的代码很好,完全有效。但是,您必须不使用constexpr函数与Visual Studio 2015进行SFINAE。您可以在此处阅读有关MSVC中表达式SFINAE的更多信息:Expression SFINAE improvements in VS 2017 RC

升级到2017将解决您的问题。