绑定非const引用到const对象丢失const限定符问题排查
编译错误分析:绑定引用丢失const限定符
问题描述
我遇到一个编译错误,提示绑定引用时丢失const限定符,但我认为自己的类型中没有const修饰,不清楚遗漏了什么。
相关代码
class PlanForBlock { public: void registerExtraIterator(DummyLoadIterator *ExtraIterator, const SIImpl *SInfo, Iterator2AGUAssignmentAnalisisVMP7& Iterator2AGUAnalisis) { assert(ExtraIterator && "Not an EyeQVMPDummyLoadIterator!"); ExtraIterators.push_back(ExtraIterator); if (SInfo->hasEyeQVMP7()) { bool IsGenXYIt = ExtraIterator->containsDummyIterKind(GenXY); Iterator2AGUAnalisis.addIterator(ExtraIterator, SBNonMasked, IsGenXYIt); } } }; class OtherClass { private: Iterator2AGUAssignmentAnalisisVMP7 Iterator2AGUAssignAnalisis; public: DummyLoadIterator * generateAndRegisterDummyLoad(AGUPlanForBlock &PlanForBlock, DummyLoadIteratorKind Kind) const; }; DummyLoadIterator *OtherClass::generateAndRegisterDummyLoad( PlanForBlock &PForBlock, DummyLoadIteratorKind Kind) const { auto *Iter = initDummyLoad(PForBlock.getBlock(), {}, Kind); PForBlock.registerExtraIterator(Iter, SInfo, Iterator2AGUAssignAnalisis); return Iter; }
(注:代码中修正了两处笔误:OtherClass的成员变量应为Iterator2AGUAssignmentAnalisisVMP7,调用时参数应为Iterator2AGUAssignAnalisis而非Iterator2AGUAssignAnalisisVMP7)
错误信息
error: binding reference of type 'Iterator2AGUAssignmentAnalisisVMP7&' to value of type 'const Iterator2AGUAssignmentAnalisisVMP7' drops 'const' qualifier PForBlock.registerExtraIterator(Iter, SInfo, Iterator2AGUAssignAnalisis); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ File.h:498:135: note: passing argument to parameter 'Iterator2AGUAnalisis' here void registerExtraIterator(DummyLoadIterator *ExtraIterator, const SIImpl *SInfo, Iterator2AGUAssignmentAnalisisVMP7& Iterator2AGUAnalisis)
原因分析
核心问题在generateAndRegisterDummyLoad函数的const修饰符上:
- 标记为
const的成员函数中,所有类成员变量都会被视为const类型,也就是说Iterator2AGUAssignAnalisis在这个函数里的实际类型是const Iterator2AGUAssignmentAnalisisVMP7。 - 但
registerExtraIterator的第三个参数要求的是非const引用Iterator2AGUAssignmentAnalisisVMP7&,C++不允许将非const引用绑定到const对象上,因此触发编译错误。
解决方案
根据实际需求选择以下两种方案之一:
方案1:允许参数为const引用(如果不需要修改参数)
如果registerExtraIterator内部不会修改Iterator2AGUAnalisis参数,将该参数改为const引用:
void registerExtraIterator(DummyLoadIterator *ExtraIterator, const SIImpl *SInfo, const Iterator2AGUAssignmentAnalisisVMP7& Iterator2AGUAnalisis) { // 原有实现不变(确认未修改参数) }
方案2:去掉成员函数的const修饰(如果需要修改参数)
如果registerExtraIterator必须修改参数,且generateAndRegisterDummyLoad函数不需要保持const语义,去掉函数的const修饰:
// 声明部分 DummyLoadIterator *generateAndRegisterDummyLoad(AGUPlanForBlock &PlanForBlock, DummyLoadIteratorKind Kind); // 实现部分 DummyLoadIterator *OtherClass::generateAndRegisterDummyLoad(PlanForBlock &PForBlock, DummyLoadIteratorKind Kind) { auto *Iter = initDummyLoad(PForBlock.getBlock(), {}, Kind); PForBlock.registerExtraIterator(Iter, SInfo, Iterator2AGUAssignAnalisis); return Iter; }
内容的提问来源于stack exchange,提问作者YAKOVM
相关产品推荐
相关产品推荐

