含std::vector与std::array成员的C++移动构造器问题
关于Vector类移动构造函数的问题解答
首先要明确:不同类型的移动语义行为不一样,你遇到的问题核心是std::array和std::vector的移动逻辑完全不同:
std::vector是动态分配内存的容器,移动构造时会把堆上资源的所有权转移给新对象,原对象会被置为有效但空的状态(比如size为0),这是你预期的“转移后原对象成员设为默认值”的情况。- 但
std::array是固定大小的栈内存储容器,它的所有元素都直接存在对象内部,没有可转移的堆资源。默认移动构造函数对std::array执行的是逐元素复制,而非资源转移,所以原对象的size_不会被自动改为{0,0}。
默认移动构造函数的规则是对每个成员分别执行移动构造:支持资源转移的类型(如std::vector)做转移,移动等价于复制的类型(如std::array、int等基本类型)就直接复制。
要实现你想要的效果,手动编写移动构造函数即可:
Vector(Vector&& other) noexcept : vector_(std::move(other.vector_)), // 转移vector_的资源 size_(other.size_) // 复制原size_的值 { // 手动将原对象的size_置为{0, 0} other.size_ = {0, 0}; }
这里建议给移动构造函数加上noexcept标记,标准库容器(如std::vector)在处理元素移动时,会优先选择标记了noexcept的移动构造,能避免不必要的拷贝,提升效率。
补充:C++标准只要求移动后的原对象处于“有效且可析构”的状态,并不强制必须置为空,所以默认行为没有问题,只是不符合你的业务预期,手动修改原对象的size_就能满足需求。
内容的提问来源于stack exchange,提问作者fakl
相关产品推荐
相关产品推荐

