std::vector::data()是否通过移动而保留
Is std::vector::data() preserved by moving?
可能重复:
移动向量会使迭代器失效吗?
考虑以下代码:
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
为真或者分配器比较相等时,这才是真的。
相关文章:
- 将对象移动到std::shared_ptr
- 有根的二进制搜索树.保留与其父级的链接
- 何时在引用或唯一指针上使用移动语义
- 为多个会话保留XPtr
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 在数组的开头添加一个元素并移动其余元素,但保留大小
- 如何配置QTreeView以在使用箭头键移动时保留多项选择
- 对容器进行排序,然后在保留原始排序的情况下移动元素
- 我如何构建公共数据,同时保留默认的移动元素和分配
- std::vector::data()是否通过移动而保留