@unixilus

Почему оператор `operator=` в классе `Vector` принимает `const init_l& l`, а не `const init_l l`, и как он работает с передаваемым сп. иниц.?

#include <iostream>
#include <initializer_list>
#define init_l std::initializer_list

template <typename T>
class Vector {
  T* data;
  int N;

public:
  Vector(int N_p = 0) : data(new T[N_p]), N(N_p) { }

  int& operator[](int n) { return data[n]; }

  Vector& operator=(const init_l<T>& l) {
    if (N != static_cast<int>(l.size())) {
      delete[] data;
      N = l.size();
      data = new T[N];
    }
    std::copy(l.begin(), l.end(), data);
    return *this;
  }
};

int main() {
  Vector<int> m(5);
  m = {1, 2, 3, 4, 5};
  for (int i = 0; i < 5; ++i) {  // Цикл для вывода элементов
    std::cout << m[i] << " ";
  }
  std::cout << std::endl;
  return 0;
}

Не совсем понимаю в этом коде почему operator= принимает const init_l& l а не const init_l l

Как он может принимать T& если мы передаем в него T? (Для краткости заменил T)

Мы же передаем список, а не ссылку на список. Разве нет?
  • Вопрос задан
  • 96 просмотров
Решения вопроса 1
@LanskoyGames
У модераторов первое место, но только с конца...
template Этим мы «получаем тип» значения

const init_l& l А здесь используем этот тип и берём ссылку, как раз в = и передаётся ссылка(то есть настоящий объект), а без & - копия.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы