假设我有一个管理指向内部缓冲区的指针的类:
class Foo
{
public:
Foo();
...
private:
std::vector<unsigned char> m_buffer;
unsigned char* m_pointer;
};
Foo::Foo()
{
m_buffer.resize(100);
m_pointer = &m_buffer[0];
}
现在,假设我还正确实现了规则 3 的东西,包括复制内部缓冲区的复制构造函数,然后将指针重新分配给内部缓冲区的新副本:
Foo::Foo(const Foo& f)
{
m_buffer = f.m_buffer;
m_pointer = &m_buffer[0];
}
如果我还实现了移动语义,那么只复制指针并移动缓冲区是否安全?
Foo::Foo(Foo&& f) : m_buffer(std::move(f.m_buffer)), m_pointer(f.m_pointer)
{ }
在实践中,我知道这应该可行,因为std::vector
移动构造函数只是移动内部指针——它实际上并没有重新分配任何东西,所以m_pointer
仍然指向一个有效的地址。但是,我不确定标准是否能保证这种行为。移动语义是否std::vector
保证不会发生重新分配,因此指向向量的所有指针/迭代器都是有效的?