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

为何赋值左右侧对象均调用非const成员函数?如何解决?

问题分析与解决

原因

C++里成员函数的重载决议是基于调用对象的常量性判断的:只有当调用对象是const修饰的,或是指向const对象的指针/引用时,才会优先匹配const版本的成员函数。

你代码里的myBufferR是普通非const对象,哪怕它处于赋值表达式的右侧,编译器仍会判定它是可修改的,因此会调用非const版本的AccessByte。

解决方法

要让myBufferR调用const版本的成员函数,需要将其转换为const引用或直接声明为const对象:

方法1:显式转为const引用

修改main里的赋值语句:

myBufferL.AccessByte(0) = static_cast<const CBuffer&>(myBufferR).AccessByte(0);

通过static_cast把myBufferR转为const CBuffer&,此时会触发const版本的AccessByte,返回Array_R[index]的引用。

方法2:声明为const对象

如果myBufferR本身不需要修改,直接声明为const即可:

const CBuffer myBufferR;
myBufferL.AccessByte(0) = myBufferR.AccessByte(0);

此时myBufferR是const对象,编译器会自动匹配const版本的成员函数。

针对operator[]场景的处理

重载operator[]时逻辑完全一致,同样依靠对象的常量性区分重载版本:

class CBuffer
{
private:
    char Array_L[10];
    char Array_R[10];
public:
    const char& operator[](int index) const { return Array_R[index]; }
    char& operator[](int index) { return Array_L[index]; }
};

int main()
{
    CBuffer myBufferL;
    const CBuffer myBufferR;

    // 左侧调用非const版本,右侧调用const版本
    myBufferL[0] = myBufferR[0];
}

如果需要在非const对象上强制调用const版本的operator[],同样可以用static_cast转换为const引用:

myBufferL[0] = static_cast<const CBuffer&>(myBufferR)[0];

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:55:09