C++代码中std::move正确使用:const std::unique_ptr移动报错排查
问题根因
- 核心矛盾是你尝试对const修饰的
std::unique_ptr执行移动操作,而std::unique_ptr的移动构造要求入参是可修改的右值引用,无法匹配const对象,最终编译器尝试调用已删除的拷贝构造函数触发报错。 - 两个具体原因叠加导致问题:
GetEventMessage被声明为const成员函数,函数内部所有成员变量都会被隐式加上const修饰,你无法在const函数中修改成员变量的状态,而移动unique_ptr本质是转移所有权,会修改原unique_ptr的内容。- 成员变量
m_message本身也被声明为const std::unique_ptr<EventMessage>,即便你去掉成员函数的const修饰,也无法对const类型的unique_ptr执行移动操作。
解决方案
根据你的实际需求二选一:
方案1:确实需要转移m_message的所有权
修改两处const修饰:
- 去掉成员变量
m_message的const声明 - 去掉
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
相关产品推荐
相关产品推荐

