为什么常量/非常量函数重载的继承不明确

Why is inheritance of a const/non-const function overload ambiguous?

本文关键字:常量 继承 不明确 重载 函数 非常 为什么      更新时间:2023-10-16

我试图创建两个类,第一个具有函数的非常量实现,第二个具有常量实现。这里有一个小例子:

class Base {
protected:
  int some;
};
class A : public virtual Base {
  const int& get() const {
    return some;
  }
};
class B : public virtual Base {
  int& get() {
    return some;
  }
};
class C : public A, B {};
C test;
test.get(); // ambiguous 

get 函数的调用不明确。无论 const 版本需要匹配更多要求。(在 const C 上调用 get 也是模棱两可的,但有一个可能的函数可以调用。标准中有这种行为的原因吗?谢谢!

当编译器试图在重载解析之前确定名称get引用的实体时,就会发生歧义。它可以是类 A 或类 B 的函数名称。为了构建重载列表,编译器只需要选择一个类来拉取函数。为了修复它,您可以将两个基类中的该名称引入派生类(并使它们公开):

class C : public A, public B { public: using A::get; public: using B::get; };

问题是你实际上没有一个统一的重载集,其中可变变体无疑是最好的,而是两个不同的重载集,在AB,编译器不会自动合并它们。

using A::get;
using B::get;

C合并过载集,从而解决歧义。