Подтвердить что ты не робот

G++ ошибка компиляции "... защищена в этом контексте", в то время как нет ошибки с clang

У меня есть следующий код:

#include <iostream>

class BaseClass {
 protected:
 static int x;
};

int BaseClass::x;

class DerivedA: public BaseClass {
 public:
     DerivedA() {
        x = 3;
     }
};    

class DerivedB: public BaseClass {
 public:
     DerivedB() {
        std::cout << DerivedA::x;
     }
};

int main(int argc, char* argv[]) {
        DerivedB b;
}

Компиляция с g++ (g++ classtest.cpp) Я получаю следующую ошибку:

classtest.cpp: В конструкторе DerivedB:: DerivedB():
classtest.cpp: 9: 5: ошибка: 'int BaseClass:: x защищен
 int BaseClass:: x;
         ^ classtest.cpp: 25: 32: ошибка: в этом контексте
         std:: cout < DerivedA:: х;

Когда я компилирую с clang++ (clang++ classtest.cpp), ошибки нет.

Почему g++ возвращает ошибку компиляции?

Я использую g++ version 5.1.0 и clang++ version 3.6.1

4b9b3361

Ответ 1

Ошибка GCC. [Class.access.base]/р5:

Член m доступен в точке R, когда он назван в классе N, если

  • m как член N является общедоступным или
  • m как член N является закрытым, а R встречается у члена или друга класса N или
  • m как член N защищен, а R встречается в члене или другом класса N или в члене класса P, полученном из N, где m как член P является общедоступным, приватным или защищенным, или
  • существует базовый класс B of N, доступный в R, а m доступен в R, когда он указан в классе B.

N is DerivedA, m is x, R является конструктором DerivedB. Существует базовый класс BaseClass of DerivedA, доступный в R, а x, названный в классе BaseClass (т.е. BaseClass::x), явно доступен в R, поэтому четвертой пулей точка, DerivedA::x доступна в R.