Ошибка при создании constexpr-объекта собственного типа

В следующем коде - ошибка компиляции:

template <typename T, size_t N = 1u>
class array
{
public:
    constexpr array(std::initializer_list<T> il) noexcept
    {
        for (auto i = 0u; i < il.size(); ++i)
        {
            m_array[i] = il.begin()[i];
        }
    }
private:
    T m_array[N];
    size_t m_size = N;
};
constexpr array<int> m_arr = { 1 };

В примере приведена только проблемная часть кода(часть шаблона и создание constexpr-объекта). Проблема в инициализации constexpr-объекта через этот конструктор, но если его создавать не как constexpr, то все работает корректно. Разные компиляторы дают разные ошибки из-за этого конструктора. В чем может быть проблема? Видел эту проблему на англо-язычном стэке, но ответ не дал ясности.


Ответы (1 шт):

Автор решения: Fat-Zer

До C++20 constexpr-конструктор должен явно инициализировать все нестатические члены класса (dcl.constexpr/4.5) . При этом это можно сделать как в списке инициализации:

constexpr array(std::initializer_list<T> il) noexcept
   :m_array{} {/*...*/}

Так и при объявлении члена:

T m_array[N] = {};

В С++20 это требование убрали и код из вопроса должен компилироваться «как есть».

→ Ссылка