簡體   English   中英

在 C++ 中用子成員 function 重載沒有引用限定符的父成員 function

[英]Overloading a parent member function without ref-qualifier with a child member function with ref-qualifier in C++

In C++ one cannot overload in one class a member function with ref-qualifier with a member function without ref-qualifier. 但同時可以從父 class 繼承一個成員 function 並將其重載到子 class 中,如示例所示:

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接受程序沒有任何錯誤,演示: https://gcc.godbolt.org/z/5zzbWcs97

哪個編譯器在這里?

GCC 接受這一點是正確的,但最近情況發生了變化。 當前的措辭是 class 中的使用聲明會忽略(在某種意義上比重載決議更嚴格,部分原因是還沒有參數列表)與class。 void()void() &成員在這個意義上是模棱兩可的,所以bf只找到Bf並且調用是有效的。

在標准的以前(在撰寫本文時,這意味着“已發布”)版本中,這兩個函數都將可用,因為&區分了它們(在某種意義上更嚴格),這不僅會使調用模棱兩可(如Clang 說)但是完全不正確,因為檢查了基類和派生類函數的重載兼容性,這是它們缺乏的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM