Почему эта статическая переменная-член const int представляется публично доступной в определении массива? - PullRequest
13 голосов
/ 08 апреля 2019

Я делаю следующие заявления:

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.
}

Так что же происходит? Является ли все определение массива каким-либо образом ограниченным пространством имен, определяющим массив? Это глюк компилятора?

Я использую g ++ -std :: c ++ 11 на Raspberry PI с использованием Lubuntu 16.04 O / S.

1 Ответ

20 голосов
/ 08 апреля 2019

Это определение

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

не является глобальной областью, это область видимости класса из-за (первого) Servo:: квалификатора области.Вы можете сделать это еще яснее, удалив избыточный второй спецификатор области действия:

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

, и он все еще прекрасно компилируется.

TL; DR - квалификатор области действия в объявителе делает все послев том же деклараторе в этой области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...