Статические члены класса в С++ вызвали небольшую путаницу для меня из-за стандартной формулировки:
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, кажется, правильно связывает все.
В качестве последующего вопроса должны быть определены аналогичные элементы non-array static constexpr (с определением шаблона вне класса)?