Adr*_*ian 5 c++ c++14 visual-studio-2015
所以我根据这个问题做了进一步的测试,我仍然有点不清楚类型推导是如何工作的。
如果我使用以下内容:
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);
}
Run Code Online (Sandbox Code Playgroud)
我没有得到编译错误。但是当我这样做时:
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);
}
Run Code Online (Sandbox Code Playgroud)
类型推导失败。这里发生了什么?为什么通过一个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'
Run Code Online (Sandbox Code Playgroud)
您的代码很好并且完全有效。但是,您不得使用 constexpr 函数在 Visual Studio 2015 中执行 SFINAE。您可以在此处阅读有关 MSVC 中的表达式 SFINAE 的更多信息:VS 2017 RC 中的表达式 SFINAE 改进
升级到2017将解决您的问题。
| 归档时间: |
|
| 查看次数: |
523 次 |
| 最近记录: |