Все контейнеры делают копию того, что они хранят. Требуется, чтобы объект был конструируемым и назначаемым для копирования, если он будет использоваться в контейнере.
Так что да, vector
, list
и т. Д. Все делают копию вашего объекта.
Еще более короткий пример:
struct foo {};
std::vector<foo> v;
v.push_back(foo());
// makes a copy of the temporary, which dies at the semicolon.
Если бы он не сделал копию, приведенный выше код был бы плохим.
Следующий код не ок:
struct foo {};
std::vector<foo*> v;
{
foo f;
v.push_back(&f); // fine, but...
} // ...now f stops existing and...
v.front(); // ...points to a non-existent object.