【问题标题】:Why does this static const int member variable appear to be accessible publicly in array definition?为什么这个静态 const int 成员变量似乎可以在数组定义中公开访问?
【发布时间】:2019-08-29 20:34:37
【问题描述】:

我做出以下声明:

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。

【问题讨论】:

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


    【解决方案1】:

    这个定义

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

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

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

    它仍然编译得很好。

    TL;DR -- 声明符上的范围限定符使该范围内同一声明符后面的所有内容。

    【讨论】:

    • 该范围内同一个声明器中的所有内容C::mem_type C::static_obj; 怎么样? C::mem_type 在道德上是在 C::static_obj 之后吗?
    • @curiousguy: C::mem_type 是一个声明说明符,根本不是声明符的一部分。它也在声明符之前物理上,因此不能轻易解析(道德不参与其中)。
    • 我没有说清楚。 Q 是关于对受保护名称的访问控制。 “是否应该以成员身份进行访问控制,包括C::mem_type C::static_obj 中的C::mem_type?”是我问的精度。
    • 我想我必须完全更新我在表达式中查看命名空间限定符范围的方式。多年来,我一直在想象它以另一种方式工作(只是影响合格的符号)。感谢您的洞察力。
    猜你喜欢
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2017-10-11
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    相关资源
    最近更新 更多