g ++编译错误"...在此上下文中受到保护",而clang没有错误

Dre*_*led 19 c++ inheritance gcc 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;
}
Run Code Online (Sandbox Code Playgroud)

用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 :: x;

当我用clang ++(clang++ classtest.cpp)编译时,没有错误.

为什么g ++会返回编译错误?

我使用g ++版本5.1.0和clang ++版本3.6.1

T.C*_*.C. 17

GCC错误.[class.access.base]/P5:

成员m是在点访问R时类命名N,如果

  • m作为N公众的成员,或
  • m作为N私人的成员,R发生在班级的成员或朋友N,或
  • m其中的一名成员N被保护,并R在成员或类的朋友发生N,或者在类的成员P来源于N,其中m作为成员P是公共的,私人的,或保护,或
  • 存在一个基类BN也就是在访问R,并m在访问R时,在课堂命名B.

NDerivedA,mx,R是...的构造者DerivedB.存在一个基类BaseClassDerivedA也就是在访问R,并x在课堂上命名BaseClass(即BaseClass::x)是明明白白访问R,所以在第四个项目符号点,DerivedA::x在访问的R.

  • 在gcc的bugzilla上找不到这个 - 想提交? (6认同)
  • 我提交了一个bug报告:https://gcc.gnu.org/bugzilla/show_bug.cgi?id = 66957 (4认同)
  • 谢谢你的明确解释.太糟糕了,我们无法为任务提供赏金,例如打开bug报告:) (3认同)