У меня есть класс Foobar
с методом sayHello()
, который выводит «Привет, привет!». Если я пишу следующий кодПеремещает ли элемент из контейнера STL его из этого контейнера?
vector<unique_ptr<Foobar>> fooList;
fooList.emplace_back(new Foobar());
unique_ptr<Foobar> myFoo = move(fooList[0]);
unique_ptr<Foobar> myFoo2 = move(fooList[0]);
myFoo->sayHello();
myFoo2->sayHello();
cout << "vector size: " << fooList.size() << endl;
Выход:
Well hello there!
Well hello there!
vector size: 1
Я запутался, почему это работает. Должно ли fooList[0]
стать нулевым, если я сделаю первый шаг? Почему работает myFoo2
?
Вот что Foobar
выглядит следующим образом:
class Foobar
{
public:
Foobar(void) {};
virtual ~Foobar(void) {};
void sayHello() const {
cout << "Well hello there!" << endl;
};
};
Ах-ха! Это внезапно имеет большой смысл. Вектор все еще говорит размер 1, но теперь это просто unique_ptr для 'nullptr' и будет очищен, когда вектор выходит из области видимости, как я надеюсь. Похоже, все работает так, как я ожидал, мой компилятор, как вы указали, просто играет на меня. Благодаря! –
Я добавил член данных к 'Foobar' и получил доступ к нему в' sayHello() '. Теперь код падает, как и ожидалось при попытке использовать 'myFoo2'. –