在enable_if_t中调用constexpr函数

时间:2017-08-20 15:56:43

标签: c++ templates gcc visual-c++ clang

考虑以下示例:

#include <type_traits>

template <typename T, typename Enable = void>
struct A;

template <typename T>
constexpr bool f() { return true; }

template <typename T>
struct A<T, std::enable_if_t<f<T>()>> {};

int main() {
  A<int> f;
}

使用clanggccMSVC gives the following error编译正常:

13 : <source>(13): error C2079: 'f' uses undefined struct 'A<int,void>'

这是MSVC或代码中的错误,我该如何解决?

1 个答案:

答案 0 :(得分:3)

我几乎完全确定这是一个MSVC错误。

某些测试显示MSVC只是拒绝与专用模板匹配,提供定义并且主模板中的static_assert可用于验证此。

在弹出一些this之后,显然在sfinae构造中使用了类型,但不知道是不是函数。

最终结果是this workaround,这有点令人讨厌,但主要是可忍受的

#include <type_traits>

template <typename T, typename = void>
struct A;

template <typename T>
struct f
{
    constexpr operator bool() {return true;}
};

template <typename T>
struct A<T, std::enable_if_t<(f<T>())>> {};  // note braces

int main()
{
    A<int> a;
}