如何定义模板类特化的静态constexpr数组成员

时间:2016-12-13 06:15:10

标签: c++ templates clang static-members constexpr

我试图在模板专用类中使用静态constexpr数组,如下所示:

///////////////////////////////////////////////////////////////////////////
struct good {
    static constexpr int values[1] = { 0 };
};

constexpr int good::values[1];

///////////////////////////////////////////////////////////////////////////
template <typename T>
struct bad;

template <>
struct bad<int> {
    static constexpr int values[1] = { 0 };  
};

constexpr int bad<int>::values[1];

///////////////////////////////////////////////////////////////////////////
int
main (int argc, char **argv)
{
#if 1
    return good::values[0];
#else
    return bad<int>::values[0];
#endif
}

我知道要求声明和定义静态成员,并且使用-std = c ++ 1z,gcc-6.2.0和clang-3.9.0对上面的'good'表示成功。< / p>

然而,'bad'的情况会导致clang-3.9.0下的未定义引用,输出如下:

danny@steve ~/src $ clang++ -std=c++1z scratch.cpp
/tmp/scratch-56fa44.o: In function `main':
scratch.cpp:(.text+0x15): undefined reference to `bad<int>::values'
clang-3.9: error: linker command failed with exit code 1 (use -v to see invocation)

我需要做一些额外的事情,或者我缺少什么,以实例化静态constexpr成员?修改为使用静态const成员时,代码似乎工作正常。

如果使用-std = c ++ 1y编译单元,代码将成功链接。

0 个答案:

没有答案