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

C++编译报错Binding reference discards qualifiers 如何正确赋值shared_ptr类成员

问题根因

你的报错是两个C++语法规则冲突共同导致的:

  • 父类commonQueue中的m_eventQueue被声明为const EventQueuePtr类型,const成员变量只能在构造函数的初始化列表中完成初始化,构造函数体内的任何赋值操作都是非法的,const变量初始化完成后就不允许修改。
  • 构造函数入参是const EventQueuePtr& eventQueue,属于const左值引用,std::move(eventQueue)转换后得到的是const右值引用,而std::shared_ptr的移动赋值运算符要求接收非const的右值引用,移动操作本身会修改原对象的状态,从const对象移动内容本身就不合法,因此编译器会报丢弃限定符的错误。

你之前不用std::move的报错本质是同一个问题:const成员不允许赋值,不管给它传左值还是右值,赋值操作本身就违反了const的约束。

修复方案

你可以根据自己的业务需求选以下任意一种方案:

方案1:保留m_eventQueue的const属性

直接在子类构造函数的初始化列表中完成m_eventQueue的初始化,构造函数体里不需要写任何赋值逻辑:

// 修改inher2.cpp中的构造函数实现
RecordingConfigJobStateSignal::RecordingConfigJobStateSignal( const EventQueuePtr& eventQueue )
    : commonQueue(), m_eventQueue(eventQueue)
{
}

这种方案下m_eventQueue整个生命周期都不能修改,符合const的语义。

方案2:允许后续修改m_eventQueue

先修改commonQueue类的定义,去掉m_eventQueue的const修饰:

// inher2.hpp中commonQueue类修改对应行
EventQueuePtr m_eventQueue;

再根据你是否需要转移参数所有权选择赋值方式:

  • 仅增加shared_ptr引用计数,不转移原参数所有权:直接赋值即可,不需要std::move
    m_eventQueue = eventQueue;
    
  • 需要转移原参数的所有权:将构造函数入参改为右值引用,再做移动
    // 先修改头文件中的构造函数声明
    RecordingConfigJobStateSignal( EventQueuePtr &&);
    // 再修改实现
    RecordingConfigJobStateSignal::RecordingConfigJobStateSignal( EventQueuePtr&& eventQueue )
    {
        m_eventQueue = std::move(eventQueue);
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:36:07