为什么此静态const int成员变量似乎可以在数组定义中公开访问?

时间:2019-04-08 16:22:28

标签: c++ c++11 language-lawyer access-control static-variables

我进行以下声明:

class Servo {

protected:

    static const int maxServos = 16;    
    static Servo servos[maxServos]; //Array declaration
};

Servo Servo::servos[Servo::maxServos]; //Array definition

...然后编译,这太棒了!但是我不明白为什么要编译它,因为在我看来maxServos受保护了,并且在定义数组时在全局范围内使用它。我尝试在另一个全局环境中使用它,的确确实得到了编译错误:

int main() {
    std::cout << Servo::maxServos;  //This will not compile.
}

那是怎么回事?数组的整个定义是否受命名空间限定的范围的影响?是编译器故障吗?

我正在使用Lubuntu 16.04 O / S在Raspberry PI上使用g ++ -std :: c ++ 11。

1 个答案:

答案 0 :(得分:20)

此定义

Servo Servo::servos[Servo::maxServos]; //Array definition

不是全局范围,由于(第一个)Servo::范围限定符,它是类范围。您可以通过删除多余的第二个作用域限定符使这一点更加清晰:

Servo Servo::servos[maxServos]; //Array definition

它仍然可以正常编译。

TL; DR-声明器上的作用域限定符将所有内容放在该作用域中的同一声明器中。