我希望標題實際上描述了什麼我想問問...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'不是必需的形式嗎?看起來所有的編譯器都是正確的。 –