请考虑以下代码:
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
?
答案 0 :(得分:0)
常量复杂性意味着不允许容器复制/移动单个元素,因此它必须将现有存储的所有权转移到新对象,因此data()
返回的指针必须相同。
对于移动赋值(而不是移动构造),只有当propagate_on_container_move_assignment
对于向量的分配器类型为真或者分配器比较相等时才为真。