为什么允许在派生类中调用受保护的静态方法?

Bor*_*ein 10 c++ inheritance

在派生类中调用一个受保护的构造是不允许的,因为解释在这里.

接受的答案解释了,只有当类的对象是类的子对象时,才protected允许访问基类对象的成员.到现在为止还挺好.AAB

但是,为什么允许(至少在GCC 4.6.3中)调用静态保护方法?具体来说,以下编译对我来说没有任何意义,而注释行没有:

class A 
{
protected:
    A() {}
    static A makeA() { return A(); }
};

class B: public A
{
public:
    static A makeAFromB()
    {
        return makeA(); // compiles
        // return A();  // does not compile
    }
};
Run Code Online (Sandbox Code Playgroud)

从哲学上讲,构造函数非常类似于返回类对象的静态方法A,这就是为什么我在这里没有得到行为差异的原因.

And*_*owl 10

但是,为什么允许(至少在GCC 4.6.3中)调用静态保护方法?

因为这就是标准所说的.适用于protected成员可访问性的约束(以及您链接的答案解释得非常好)在C++ 11标准的第11.4/1节中定义,其第一句规定如下:

非静态数据成员或非静态成员函数是其命名类的受保护成员时,将应用超出第11章中所述之外的其他访问检查(11.2).[...]

附加访问检查不适用于静态成员或静态成员函数.