可以在 C++ 中使用子类名称引用方法吗?
请考虑一个A带有方法的结构体f和一个B不重新定义的继承结构体f。在这种情况下,B::f指的是与 相同的方法A::f。
是否允许使用名称调用对象的方法f,如下例所示?AB::f
struct A { void f() {} };
struct B : A {};
int main() { A{}.B::f(); }
Clang 和 GCC 在这里有分歧。Clang 对程序没问题,而 GCC 打印错误:
error: 'B' is not a base of 'A'
演示:https : //gcc.godbolt.org/z/Pn7jehzdP
根据标准,哪个编译器就在这里?
回答
GCC是正确的:[class.access.base]/6 要求指向左操作数的指针.能够是
术语“命名类”在[class.access.general]/5 中定义;在您的示例中,它是B,显然 anA*不能隐式转换为 a B*。
对于没有非公共成员或继承的这种特殊情况,规则的放置是违反直觉的。