我有一个带有 Foobar
方法的 sayHello()
类,该方法输出“你好!”。如果我写下面的代码
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;
};
};
最佳答案
是的。
它没有;它会导致未定义的行为。如果您使用空指针调用不取消引用 this
的非虚拟函数,您的编译器恰好会生成不会崩溃的代码。
如果您按如下方式更改函数,则会更清楚发生了什么:
void sayHello() const {
cout << "Well hello there! My address is " << this << endl;
}
Well hello there! My address is 0x1790010
Well hello there! My address is 0
vector size: 1
关于c++ - 从 STL 容器中 move 元素是否会将其从该容器中移除?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8974418/