Есть ли способ объявить и создать экземпляр vector
при пропуске операции копирования?
Нет. Когда вы делаете vector<A> obj {1,2,3}
, компилятор создает std::initializer_list<A>
из предоставленных значений. Это std::initializer_list
создание - причина, по которой вы видите три обычных вызова конструктора. Затем вектор должен скопировать эти элементы, поскольку базовое хранилище для этих элементов - const
. Там не было обойти это с помощью инициализации списка. Даже vector<A> obj {A(1),A(2),A(3)}
все равно приведет к копированию.
Если вы не хотите этого, то вы можете создать хранилище для элементов, используя reserve
, а затем использовать emplace_back
для непосредственного конструирования объектов. в векторе, таком как
vector<A> obj;
obj.reserve(3);
for (int i = 1; i < 4, ++i)
obj.emplace_back(i);
Выполнение obj_1 = obj
, если мой obj_1
был предварительно инициализирован, приводит к вызову конструктора копирования вместо функции operator=
внутри моего класса A, как я ожидал?
Это потому, что obj_1
пусто. Поскольку он пуст, отсутствует элемент для вызова оператора присваивания. Вместо этого он создает элементы в obj_1
, которые являются копиями obj
, и наиболее эффективный способ сделать это - просто вызвать конструктор копирования вместо создания объектов по умолчанию и затем присвоить им.
Если бы у вас было
vector<A> obj {1,2,3};
vector<A> obj_1 {3, 4, 5};
obj_1 = obj;
Вместо этого вы бы увидели, что вместо этого будет использоваться оператор присваивания, поскольку есть объекты, которые фактически должны быть назначены.