You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 01:52:24