为何赋值左右侧对象均调用非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
相关产品推荐
相关产品推荐

