【问题标题】:Overloading a parent member function without ref-qualifier with a child member function with ref-qualifier in C++在 C++ 中用带有 ref-qualifier 的子成员函数重载没有 ref-qualifier 的父成员函数
【发布时间】:2021-11-18 06:52:02
【问题描述】:

在 C++ 中,不能在一个类中重载具有 ref-qualifier 的成员函数和不带 ref-qualifier 的成员函数。但同时也可以从父类继承一个成员函数,并在子类中重载它,如示例所示:

struct A {
    void f() {}
    //void f() & {} //overload error everywhere
};

struct B : A {
    using A::f;
    void f() & {} //ok everywhere
};

int main() {
    B b;
    b.f(); //ok in GCC only
}

只有在调用f 期间,Clang 才会抱怨call to member function 'f' is ambiguous。但是GCC接受程序没有任何错误,demo:https://gcc.godbolt.org/z/5zzbWcs97

哪个编译器在这里?

【问题讨论】:

  • 呵呵,好奇。看起来他们为此使用了不同版本的标准。
  • 我会说 gcc-bug。 (msvc 拒绝它为 clang Demo)。

标签: c++ language-lawyer overloading ref-qualifier


【解决方案1】:

GCC正确接受这一点,但最近情况发生了变化。当前的措辞是类中的 using-declaration 会忽略不明确的(基类)声明(在某种意义上比重载决议更严格,部分原因是没有参数列表然而)与类中的其他声明。 void()void() & 成员在这个意义上是模棱两可的,所以 b.f 只找到 Bf 并且调用是有效的。

在标准的以前(在撰写本文时,这意味着“已发布”)版本中,这两个函数都将可用,因为 & 区分了它们(在某种意义上更严格),这不仅会呈现调用模棱两可(正如 Clang 所说),但完全不正确,因为检查了基类和派生类函数的 overload 兼容性,而这正是它们所缺乏的。

【讨论】:

猜你喜欢
  • 2014-09-09
  • 2014-06-08
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多