C++ 在类模板中定义变量模板

C++ 在类模板中定义变量模板,c++,gcc,clang,c++14,C++,Gcc,Clang,C++14,考虑这个最小的例子: template<class X> struct foo; template<> struct foo<int> { template<class = void> static constexpr int x = 0; }; template<class T> constexpr int foo<int>::x<T>; 模板结构foo; 模板 结构foo { 模板 静态

考虑这个最小的例子:

template<class X> struct foo;

template<>
struct foo<int>
{
    template<class = void>
    static constexpr int x = 0;
};

template<class T>
constexpr int foo<int>::x<T>;
模板结构foo;
模板
结构foo
{
模板
静态constexpr int x=0;
};
模板
constexpr int foo::x;
最后两行是必需的,因为否则当使用变量
x
时,我们将得到一个未定义的引用

虽然gcc(6.2.1)很乐意编译这段代码,但clang(3.9.0)在最后一行失败了,它传递了一条神秘的消息:

错误:变量模板部分专门化未专门化 任何模板参数;要定义主模板,请删除 模板参数列表


哪一行是正确的行为?

最后两行代码应该是:

template<class T>
const int foo<int>::x;
模板
常量int foo::x;

模板
constexpr int foo::x;

喜欢

最后两行代码应该是:

template<class T>
const int foo<int>::x;
模板
常量int foo::x;

模板
constexpr int foo::x;
喜欢

@Holt@Holt