可被Clang编译但GCC编译失败的C++代码是否符合标准?
代码合规性分析
这段代码完全符合C++标准的定义,GCC拒绝编译属于编译器实现问题,Clang的行为是正确的。
核心规则解释
C++标准允许通过基类指针/引用,使用派生类的作用域限定符调用继承而来的成员函数:
- 这里
static_cast<B*>(d)得到指向基类B的指针,->D::foo()的写法合法:D继承自B且未重写foo,D::foo本质是继承自B的虚函数,作用域限定符D::会明确指定调用该作用域下的foo,同时抑制虚函数的动态绑定。 - 即便
D重写了foo,这种写法依然合规:此时会直接调用D::foo,而非通过虚表动态派发。
编译器行为差异
Clang正确实现了标准规则,允许该语法;GCC在此场景下的报错不符合标准要求,属于其实现中的疏漏。
内容的提问来源于stack exchange,提问作者konchy
相关产品推荐
相关产品推荐

