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
быть определено вне объявления класса?
Ответы
Ответ 1
Эквалайзер вне линии такой же, как для других статических (нецелевых) элементов, минус инициализация:
template<size_t N>
constexpr std::array<char, N> Foo<N>::arr;
Как и другие статические члены, это входит в заголовок - как и сам шаблон.