G++多继承场景下访问operator==出现歧义错误是否为GCC缺陷?
问题解答
结论
这属于GCC的历史实现缺陷,该问题已在GCC 12及后续版本中修复。
根因说明
C++标准规定二元运算符的重载决议需要按以下流程执行,只有完成所有查找步骤合并候选集后,才会进行歧义判定:
- 首先执行成员运算符查找:从子类作用域向上遍历所有父类的
operator==成员函数 - 再执行非成员运算符查找:包含普通非成员函数查找、以及针对实参类型的ADL(参数依赖查找)
你给出的示例中,成员查找阶段确实会在父类A、B的operator==之间产生歧义,但按照标准规则,该歧义不应该直接终止查找流程,需要继续完成非成员查找,将全局定义的operator==(const C&, const C&)加入候选集后再做决议。全局版本的参数和调用实参完全匹配,优先级远高于需要隐式转换的父类成员运算符版本,本应被直接选中。
GCC旧版本的实现违反了上述规则,在成员查找阶段遇到歧义后直接抛出错误,没有继续执行非成员查找流程,才会出现不符合预期的报错。你可以升级到GCC 12及以上版本规避该问题。
内容的提问来源于stack exchange,提问作者Fedor
相关产品推荐
相关产品推荐

