4

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

2 回答 2

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
于 2012-01-23T15:59:25.797 回答
1

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

另一种评论: emplace_back 函数的使用可能是不够的。

尝试:

vector<unique_ptr<Foobar>> fooList;
fooList.emplace_back( new Foobar );
于 2012-01-23T16:33:51.073 回答