为什么这个 static const int 成员变量在数组定义中似乎可以公开访问?
Why does this static const int member variable appear to be accessible publicly in array definition?
我声明如下:
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
这个定义
Servo Servo::servos[Servo::maxServos]; //Array definition
不是全局范围,由于(第一个)Servo::
范围限定符,它是 class 范围。您可以通过删除多余的第二个范围限定符使这一点更加清晰:
Servo Servo::servos[maxServos]; //Array definition
它仍然编译得很好。
TL;DR -- 声明符上的范围限定符使该范围内的同一声明符之后的所有内容。
我声明如下:
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这个定义
Servo Servo::servos[Servo::maxServos]; //Array definition
不是全局范围,由于(第一个)Servo::
范围限定符,它是 class 范围。您可以通过删除多余的第二个范围限定符使这一点更加清晰:
Servo Servo::servos[maxServos]; //Array definition
它仍然编译得很好。
TL;DR -- 声明符上的范围限定符使该范围内的同一声明符之后的所有内容。