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

C++代码中std::move正确使用:const std::unique_ptr移动报错排查

问题根因
  • 核心矛盾是你尝试对const修饰的std::unique_ptr执行移动操作,而std::unique_ptr的移动构造要求入参是可修改的右值引用,无法匹配const对象,最终编译器尝试调用已删除的拷贝构造函数触发报错。
  • 两个具体原因叠加导致问题:
    1. GetEventMessage被声明为const成员函数,函数内部所有成员变量都会被隐式加上const修饰,你无法在const函数中修改成员变量的状态,而移动unique_ptr本质是转移所有权,会修改原unique_ptr的内容。
    2. 成员变量m_message本身也被声明为const std::unique_ptr<EventMessage>,即便你去掉成员函数的const修饰,也无法对const类型的unique_ptr执行移动操作。
解决方案

根据你的实际需求二选一:

方案1:确实需要转移m_message的所有权

修改两处const修饰:

  1. 去掉成员变量m_message的const声明
  2. 去掉GetEventMessage函数的const修饰
    修改后代码示例:
class EventBase
{
public:
    std::unique_ptr<EventMessage> GetEventMessage()
    {
        return std::move(m_message);
    }
private:
    std::unique_ptr<EventMessage> m_message;
    bool m_Property;
};

方案2:仅调试访问内容、不需要转移所有权(更符合你的代码注释需求)

不需要修改const修饰,直接返回指针或常量引用即可,完全不涉及所有权转移:

class EventBase
{
public:
    // 返回常量指针
    const EventMessage* GetEventMessage() const
    {
        return m_message.get();
    }
    // 也可以选择返回常量引用
    // const EventMessage& GetEventMessage() const
    // {
    //     return *m_message;
    // }
private:
    std::unique_ptr<EventMessage> const m_message;
    bool m_Property;
};

内容的提问来源于stack exchange,提问作者badri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:54:03