可以在 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*

对于没有非公共成员或继承的这种特殊情况,规则的放置是违反直觉的。


以上是可以在 C++ 中使用子类名称引用方法吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>