std::vector::data()是否通过移动而保留

Is std::vector::data() preserved by moving?

本文关键字:移动 保留 vector data std 是否      更新时间:2023-10-16

可能重复:
移动向量会使迭代器失效吗?

考虑以下代码:

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

第12行的vec.data() != data有可能吗?类似地,

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

恒定的复杂性意味着容器不允许复制/移动单个元素,因此它必须将现有存储的所有权转移到新对象,因此data()返回的指针必须相同。

对于移动赋值(而不是移动构造(,只有当向量的分配器类型的propagate_on_container_move_assignment为真或者分配器比较相等时,这才是真的。