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] が null になるべきではありませんか?

はい。

myFoo2 が機能するのはなぜですか?

そうではありません。未定義の動作を引き起こします。null ポインターを使用して逆参照しない非仮想関数を呼び出した場合、コンパイラはたまたまクラッシュしないコードを生成します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 に答える