变量模板部分特化和constexpr

时间:2017-01-01 19:47:59

标签: c++ templates c++14

我正在尝试专门理解模板和变量模板。考虑一下:

template<int M, int N>
const int gcd1 = gcd1<N, M % N>;

template<int M>
const int gcd1<M, 0> = M;

std::cout << gcd1<9, 6> << "\n";

打印0这是错误的。但是,如果我使用上面的constexpr代替const,我会得到正确答案3。我再次得到结构模板的正确答案:

template<int M, int N>
struct gcd2 {
    static const int value = gcd2<N, M % N>::value;
};

template<int M>
struct gcd2<M, 0> {
    static const int value = M;
};
std::cout << gcd2<9, 6>::value << "\n";

我做错了什么?

编辑: gcd1在没有基本案例专业化的情况下编译也很好。怎么会?我正在使用Visual Studio 2015。

1 个答案:

答案 0 :(得分:3)

我认为这是 MSVC 编译器中的错误。

根据this页面变量模板应该可用,因为 MSVC 2015 update 2 。似乎即使在 update 3 中它们也无法正常工作。

无论如何,您的代码可以正常使用 gcc 6.1 wandbox