是通过移动保留std :: vector :: data()吗?

时间:2012-12-28 14:11:00

标签: c++ c++11 stdvector language-lawyer move-semantics

  

可能重复:
  Does moving a vector invalidate iterators?

请考虑以下代码:

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 ++的实现中,因为移动构造函数实现为简单的指针赋值,但似乎标准没有在其上指定任何内容(类似于Is the capacity required to be preserved when moving a std::vector?)。可以&#34;恒定的复杂性&#34;保证vec.data() == data

1 个答案:

答案 0 :(得分:0)

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

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