我希望标题实际上描述了什么我想问问...C++方法调用和类型范围分辨率歧义
我写了一张与GCC编译和工程,我预期的代码。但是,它不会用llvm进行编译,并且在使用icc编译时代码的执行方式会有所不同!
这是问题的一个例子:
#include <iostream>
using std::cout; using std::endl;
class A {
public:
virtual void foo() { cout << "A::foo()" << endl; }
};
class B : public A {
public:
typedef A base;
virtual void foo() { cout << "B::foo()" << endl; }
};
int main() {
typedef B base;
base* bp = new B();
bp->base::foo();
}
GCC输出:A :: foo的()
ICC输出:B :: foo的()
有人能解释一下什么是标准说一下这个案例?
我想说这是GCC和ICC中的一个错误,因为'B :: base'不是''B''的_member_,这意味着它不可能作为一个成员来访问它('bp-> base')。 –
我同意@JoachimPileborg,而且在这个范围内'base'可以被解释为B.你有警告标志编译? (-gall for gcc) – Geoffroy
这不就是未定义的行为,因为'main'不是必需的形式吗?看起来所有的编译器都是正确的。 –