变量模板部分特化和constexpr

win*_*ght 5 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";
Run Code Online (Sandbox Code Playgroud)

它打印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";
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

编辑: gcd1编译正常,没有基本案例专业化.怎么会?我正在使用Visual Studio 2015.

Edg*_*jān 3

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

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

不管怎样,你的代码在gcc 6.1上工作得很好:wandbox