求C++类Number的自动生成移动赋值运算符具体实现代码
类Number自动生成的移动赋值运算符实现
对于你提供的仅包含mutable std::shared_ptr<Vertex>成员的Number类,编译器自动生成的移动赋值运算符遵循C++标准的逐成员移动规则,具体实现大致如下:
Number& operator=(Number&& rhs) noexcept( noexcept(std::declval<std::shared_ptr<Vertex>&>() = std::move(std::declval<std::shared_ptr<Vertex>>())) ) { // 对成员执行移动赋值 vtx = std::move(rhs.vtx); return *this; }
关键细节说明:
- 逐成员移动:自动生成的移动赋值会对类的每个非静态成员执行移动赋值操作。这里因为
Number只有vtx一个成员,所以核心逻辑就是移动赋值std::shared_ptr——移动后rhs.vtx会被置为空状态,当前对象接管原rhs持有的Vertex指针,且不会增加引用计数,这比拷贝赋值更高效。 - 返回值与noexcept:标准规定自动生成的移动赋值运算符返回
Number&(非const左值引用),并且会根据成员移动操作的异常安全性标记noexcept(这里std::shared_ptr的移动赋值是noexcept的,所以生成的运算符也是noexcept)。 - mutable成员的处理:虽然
vtx被声明为mutable,但移动赋值的this指针指向的是非常量对象,因此可以直接修改该成员,不受const限制。
你代码中operator+=返回(*this + rhs),而operator+返回局部对象Number x,此时会触发移动语义,需要移动赋值运算符完成临时对象到目标对象的赋值——这就是为什么删除移动赋值后程序无法正常工作,而自动生成的版本恰好满足需求的原因。
内容的提问来源于stack exchange,提问作者GRamon
相关产品推荐
相关产品推荐

