为什么 const/non-const 函数重载的继承不明确?

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

我试图创建两个 类,第一个是函数的非 const 实现,第二个是 const 实现。这是一个小例子:

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 指的是哪个实体时,就会出现歧义。它可以是来自 class A 或来自 class B 的函数名称。为了构建重载列表,编译器需要 select 只是 classes 之一从中拉取功能。为了修复它,您可以将两个基本 classes 中的名称引入派生 class(并使它们成为 public):

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

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

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

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