Происходит следующее: когда вы добавляете B
к вектору, вектор, вероятно, имеет емкость только для 1 элемента, поэтому ему пришлось переместить свой существующий элемент в другой вектор (уничтожив тот, что находится в исходном хранилище)
Давайте добавим еще несколько журналов, чтобы увидеть, что происходит:
#include <iostream>
#include <string>
#include <vector>
struct Thing {
explicit Thing(std::string name) : name_{std::move(name)} {
std::cout << "Constructed a thing called " << name_ << " at " << this << std::endl;
}
Thing(Thing&& t) noexcept : name_{std::move(t.name_)} {
std::cout << "Moved a thing called " << name_ << " from " << &t << " to " << this << std::endl;
}
Thing(const Thing& t) : name_{t.name_} {
std::cout << "Copied a thing called " << name_ << " from " << &t << " to " << this << std::endl;
}
~Thing() {
std::cout << "Deconstructed a thing called " << name_ << " at " << this << std::endl;
};
std::string name_;
};
int main() {
std::vector<Thing> things{Thing("A")};
std::cout << "Size: " << things.size() << " Capacity: " << things.capacity() << std::endl;
things.emplace_back("B");
std::cout << "Size: " << things.size() << " Capacity: " << things.capacity() << std::endl;
}
Пример вывода:
Constructed a thing called A at 0x1111
Copied a thing called A from 0x1111 to 0x2222
Deconstructed a thing called A at 0x1111
Size: 1 Capacity: 1
Constructed a thing called B at 0x3333
Moved a thing called A from 0x2222 to 0x4444
Deconstructed a thing called A at 0x2222
Size: 2 Capacity: 2
Deconstructed a thing called A at 0x4444
Deconstructed a thing called B at 0x3333