我试图在模板专用类中使用静态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编译单元,代码将成功链接。