Почему неконстантный std :: array :: operator [] не является constexpr?

Я пытаюсь заполнить 2D-массив во время компиляции с помощью данной функции. Вот мой код:

template<int H, int W>
struct Table
{
  int data[H][W];
  //std::array<std::array<int, H>, W> data;  // This does not work

  constexpr Table() : data{}
  {
    for (int i = 0; i < H; ++i)
      for (int j = 0; j < W; ++j)
        data[i][j] = i * 10 + j;  // This does not work with std::array
  }
};

constexpr Table<3, 5> table;  // I have table.data properly populated at compile time

Работает просто отлично,table.data правильно заполнен во время компиляции.

Однако, если я изменю обычный 2D-массивint[H][W] сstd::array<std::array<int, H>, W>, У меня есть ошибка в теле цикла:

error: call to non-constexpr function 'std::array<_Tp, _Nm>::value_type& std::array<_Tp, _Nm>::operator[](std::array<_Tp, _Nm>::size_type) [with _Tp = int; long unsigned int _Nm = 3ul; std::array<_Tp, _Nm>::reference = int&; std::array<_Tp, _Nm>::value_type = int; std::array<_Tp, _Nm>::size_type = long unsigned int]'
data[i][j] = i * 10 + j;
^
Compilation failed

Очевидно, я пытаюсь вызвать неконстантную перегрузкуstd::array::operator[], который неconstexpr, Вопрос в том, почему это не такconstexpr? Если C ++ 14 позволяет нам изменять переменные, объявленные вconstexpr область, почему это не поддерживаетсяstd::array?

Раньше я думал, чтоstd::array это как обычный массив, только лучше. Но вот пример, где я могу использовать простой массив, но не могу использоватьstd::array.

Ответы на вопрос(4)

Ваш ответ на вопрос