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

How do I define a static constexpr array member of a template class specialisation

本文关键字:专业化 静态 constexpr 组成员 数组 何定义 定义      更新时间:2023-10-16

我试图在模板专用类中使用静态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
}

我知道要求声明和定义静态成员的要求,并且上面的"好"情况似乎在GCC-6.2.0和Clang-3.9.0中成功使用-std = C 1Z。<<<<<<

然而,"不良"案例导致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成员?修改以使用静态常量成员时,该代码似乎正常工作。

如果使用-STD = C 1Y。

,代码将成功链接。

我需要做其他事情,还是我缺少的是实例化静态constexpr成员?

该代码看起来很好,但是它确实无法在Clang中链接到5.0.2版,但是在Clang 6.0中已完全接受。演示:https://gcc.godbolt.org/z/ka7w4bbqf

这表明它只是一个编译器错误。