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メンバーを同様に定義する必要がありますか(クラス外のテンプレート定義を使用)?