在下面的测试程序中,
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
哪个编译器在这里是正确的(如果有的话)(为什么重载解析不模糊)?
哪个编译器在这里是正确的(如果有的话)(为什么重载解析不模糊)?
调用隐式成员函数是正确的行为,因为它不需要对参数进行转换
B{}
。