Я надеюсь, что заголовок действительно описывает то, что я хотел спросить...
Я написал фрагмент кода, который компилируется с помощью 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()
Может ли кто-нибудь объяснить, что стандарт говорит об этом случае?
B::base
не является членом группыB
, а это означает, что доступ к нему как к члену (bp->base
) невозможен. - person Some programmer dude   schedule 20.06.2012base
можно интерпретировать как B в этой области. Вы скомпилировали с флагами предупреждений? (-Стена для gcc) - person Geoffroy   schedule 20.06.2012main
не имеет требуемой формы? Похоже, все компиляторы правы. - person Kerrek SB   schedule 20.06.2012base
неоднозначны, и не предпочитает один другому. Я действительно хотел бы, чтобы у нас был авторитетный ответ здесь, 3 компилятора - 3 поведения ... это, конечно, странная штука. - person Matthieu M.   schedule 20.06.2012