Ошибка при создании 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 шт):
До C++20 constexpr-конструктор должен явно инициализировать все нестатические члены класса (dcl.constexpr/4.5) . При этом это можно сделать как в списке инициализации:
constexpr array(std::initializer_list<T> il) noexcept
:m_array{} {/*...*/}
Так и при объявлении члена:
T m_array[N] = {};
В С++20 это требование убрали и код из вопроса должен компилироваться «как есть».