普通和显式对象成员函数之间的重载解析

问题描述 投票:0回答:1

在下面的测试程序中,

struct B
有两个成员函数
f
,可以使用
B{}.f()
来调用:一个普通的
f()
和另一个带有显式对象的
f(this A)

struct A {
    int f() { return 1; }
};

struct B : A {
    using A::f;
    int f(this A) { return 2; }
};

int main() {
    return B{}.f();
}

重载决策必须选择哪个函数?

GCC 和 MSVC 更喜欢普通成员函数

f()
并且程序返回
1

但是 Clang 做出了相反的选择,选择显式对象成员函数

f(this A)
并且程序返回
2

在线演示:https://gcc.godbolt.org/z/1bo69Ta8q

哪个编译器在这里是正确的(如果有的话)(为什么重载解析不模糊)?

c++ language-lawyer overload-resolution c++23 explicit-object-parameter
1个回答
0
投票

哪个编译器在这里是正确的(如果有的话)(为什么重载解析不模糊)?

调用隐式成员函数是正确的行为,因为它不需要对参数进行转换

B{}

© www.soinside.com 2019 - 2024. All rights reserved.