5

重複の可能性:
ベクトルを移動するとイテレータが無効になりますか?

次のコードを検討してください。

std::vector<T> prepare(T*& data) {
    std::vector<T> buffer;
    // Fill in buffer.
    data = buffer.data();
    return buffer;
}

...

T* data;
auto vec = prepare(data);
// line 12

vec.data() != data12行目でそれは可能ですか?同様に、

std::vector<T> buffer;
// ... Fill in buffer ...
T* data = buffer.data();
auto vec = std::move(buffer);
// line 5

5行目でそれは可能vec.data() != dataですか?

libstdc++とlibc++の実装では、実際には両方は不可能です。これは、moveコンストラクターが単純なポインター割り当てとして実装されているためですが、標準では何も指定されていないようです(stdを移動するときに容量を保持する必要があるのと同様です。 :vector?)。「一定の複雑さ」はそれを保証できvec.data() == dataますか?

4

1 に答える 1

0

一定の複雑さは、コンテナーが個々の要素をコピー/移動することを許可されていないことを意味するため、既存のストレージの所有権を新しいオブジェクトに転送する必要があるため、返されるポインターdata()は同じでなければなりません。

propagate_on_container_move_assignmentベクトルのアロケータの型が true であるか、アロケータが等しい場合にのみ true となる (move の構築ではなく) move 代入の場合。

于 2012-12-28T15:09:24.780 に答える