Подтвердить что ты не робот

Undefined ссылка на статический constexpr

В этом фрагменте кода:

template <size_t N>
struct Foo {
   static constexpr std::array<char, N> arr{{0}};
   static const char *data() { return &arr[0]; }
};

template<>
constexpr std::array<char, 5> Foo<5>::arr;

int main()
{
   std::cout << Foo<5>::data() << std::endl;
}

с gcc 5.2 Я получил ссылку undefined на Foo<5ul>::arr, а clang 3.7 дает ошибку времени компиляции:

Объявление константного элемента constexpr 'arr' требует инициализатора

Что не так, и как static constexpr быть определено вне объявления класса?

4b9b3361

Ответ 1

Эквалайзер вне линии такой же, как для других статических (нецелевых) элементов, минус инициализация:

template<size_t N>
constexpr std::array<char, N> Foo<N>::arr;

Как и другие статические члены, это входит в заголовок - как и сам шаблон.