从STL容器移动元素是否从该容器中移除它?

时间:2012-01-23 15:51:56

标签: c++ visual-studio-2010 stl move-semantics

我有一个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; 
    };
};

2 个答案:

答案 0 :(得分:12)

  

当我第一次移动时,fooList [0]不应该变为空吗?

  

为什么myFoo2有效?

没有;它会导致未定义的行为。如果使用空指针调用非解除引用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

答案 1 :(得分:1)

答案是:不,移动操作不会从容器中删除元素。

另一个评论:使用emplace_back函数可能不够。

尝试:

vector<unique_ptr<Foobar>> fooList;
fooList.emplace_back( new Foobar );