Создание дополнительного класса для класса двумерных матриц

Столкнулся с такой проблемой при создании класса двумерных матриц:

Ошибки:

  1. E0461 начальное значение ссылки на неконстантный параметр должно быть левосторонним значением

  2. C2440 return: невозможно преобразовать "Matrix::MatrixRow" в "double &"

По смыслу все понятно: Наш оператор [] в class Matrix возвращает указатель на один из строк, а далее оператор [] находящийся в class MatrixRow возвращает уже сам элемент из массива. Вообще, данный код ниже мне написал Chat GPT, поскольку столкнулся с таким синтаксисом впервые, просто хочу узнать в чем конкретно ошибся. Нашел статью с данном ошибкой на stack overflow западном, но не знаю как применить данное решение ошибки на моем примере https://stackoverflow.com/questions/55083497/c-cannot-convert-input-param-to-reference

class MatrixRow{
public:
   MatrixRow(double* matrixRow) : matrixRow(matrixRow) {}
   double& operator[](int index){
      return matrixRow[index];
   }
private:
   double* matrixRow;
};

class Matrix{
   MatrixRow& operator[](int index){
      return MatrixRow(matrix_arr[index]);
   } 
private:
   double** matrix_arr; 
};

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

Автор решения: Koto SCrafter

Вы ссылаетесь на временный объект. Он является только копией того участка памяти, который вы имели ввиду. Указатель же указывает именно на память

double* operator[](int index) {
    return matrix_arr[index];
}

Лучше всего удалить класс MatrixRow в принципе и возвращать обычный указатель на массив из double

→ Ссылка
Автор решения: Stanislav Volodarskiy

Возвращайте копию ряда. Ряд состоит из одного указателя, возвращение его по значению не влияет на производительность.

   MatrixRow operator[](int index){
      return MatrixRow(matrix_arr[index]);
   } 

P.S. Прочитайте учебник про указатели и ссылки. И про время их жизни.

→ Ссылка