C中的静态类成员由于标准的语言对我造成了一些混乱:
9.4.2 Static data members [class.static.data]
The declaration of a static data member in its class definition is not a definition…
然而,一个constexpr需要被初始化(AFAIK,在标准中找不到引号)(例如在类定义中).
由于对constexpr的限制,我实际上忘记了静态成员在类之外定义的必要条件,直到我尝试访问一个静态constexpr数组. This related question提供了定义数组成员的正确方法,但我对类模板中对此定义的影响感兴趣.
这是我最终的结论:
template
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
constexpr std::size_t MyClass::_lut[256];
这是正确的语法吗?特别是在定义中使用模板感到尴尬,但是GCC似乎正在将一切都适当地链接起来.
作为一个后续问题,应该类似地定义非数组静态constexpr成员(模板定义在类之外)?