ken*_*ytm 6 c++ stdvector language-lawyer move-semantics c++11
可能重复:
移动向量是否会使迭代器失效?
请考虑以下代码:
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
Run Code Online (Sandbox Code Playgroud)
vec.data() != data
第12行可能吗?同样的,
std::vector<T> buffer;
// ... Fill in buffer ...
T* data = buffer.data();
auto vec = std::move(buffer);
// line 5
Run Code Online (Sandbox Code Playgroud)
vec.data() != data
第5行有可能吗?
实际上两者都不可能在libstdc ++和libc ++的实现中,因为移动构造函数实现为简单的指针赋值,但似乎标准没有在其上指定任何内容(类似于移动std时需要保留的容量: :矢量?)."不变的复杂性"可以保证vec.data() == data
吗?
恒定的复杂性意味着容器不允许复制/移动单个元素,因此它必须将现有存储的所有权转移给新对象,因此返回的指针data()
必须相同。
对于移动分配(而不是移动构造),仅当propagate_on_container_move_assignment
向量的分配器类型为 true 或分配器比较相等时才为 true。
归档时间: |
|
查看次数: |
453 次 |
最近记录: |