由于标准的措辞,C++ 中的静态类成员给我带来了一些困惑:
9.4.2 静态数据成员 [class.static.data]
在其类定义中声明静态数据成员不是定义...
然而,需要在声明时(例如,在类定义中)初始化constexpr(AFAIK,无法从标准中找到引用)。
由于对 constexpr 的限制,我实际上已经忘记了在类之外定义静态成员的必要性,直到我尝试访问静态 constexpr 数组。这个相关问题提供了定义数组成员的正确方法,但我对类模板中这个定义的含义感兴趣。
这就是我最终的结果:
template<typename T>
class MyClass
{
private:
static constexpr std::size_t _lut[256] = { /* ... */ };
T _data;
public:
static constexpr std::size_t GetValue(std::size_t n) noexcept
{
return _lut[n & 255];
}
// ...
};
template<typename T>
constexpr std::size_t MyClass<T>::_lut[256];
这是正确的语法吗?特别是在定义中使用模板感觉很尴尬,但 GCC 似乎正在适当地链接一切。
作为后续问题,是否应该类似地定义非数组静态 constexpr 成员(在类之外使用模板定义)?