C++ std::vector::data()是否通过移动保留?

C++ std::vector::data()是否通过移动保留?,c++,c++11,stdvector,language-lawyer,move-semantics,C++,C++11,Stdvector,Language Lawyer,Move Semantics,可能重复: 考虑以下代码: 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 有没有可能vec.data()!=第5行中的数据 实际上,这两种方法

可能重复:

考虑以下代码:

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
有没有可能
vec.data()!=第5行中的数据


实际上,这两种方法在libstdc++和libc++的实现中都是不可能的,因为move构造函数是作为简单的指针赋值实现的,但是标准似乎没有对其进行任何指定(类似于)。“常量复杂性”能否保证
vec.data()==data

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


对于移动赋值(而不是移动构造),只有当向量的分配器类型或分配器比较相等时
propagate\u on\u container\u move\u assignment
才是真的。

一些疯狂的实现可以移动/复制常量的单个元素。@zch:这是连续性要求所禁止的。@BenVoigt,关于
if(@zch:检查我在对这个问题的评论中链接的两个问题。@zch,这被称为小对象优化,但
vector::swap()
必须为nothrow,这不允许小对象优化会使迭代器/指针无效的东西列举得非常详细。另外相关的还有:
std::vector<T> buffer;
// ... Fill in buffer ...
T* data = buffer.data();
auto vec = std::move(buffer);
// line 5