оператор разрешения области без области - PullRequest
50 голосов
/ 16 сентября 2008

В C ++, какова цель оператора разрешения области при использовании без области? Например:

::foo();

Ответы [ 6 ]

64 голосов
/ 16 сентября 2008

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

void bar();    // this is a global function

class foo {
    void some_func() { ::bar(); }    // this function is calling the global bar() and not the class version
    void bar();                      // this is a class member
};

Если вам нужно вызвать глобальную функцию bar () из функции-члена класса, вы должны использовать :: bar (), чтобы получить глобальную версию функции.

7 голосов
/ 16 сентября 2008

Также следует заметить, что разрешение имени происходит до разрешения перегрузки. Поэтому, если в текущей области видимости есть что-то с таким же именем, оно перестанет искать другие имена и попытается использовать их.

void bar() {};
class foo {
    void bar(int) {};
    void foobar() { bar(); } // won't compile needs ::bar()
    void foobar(int i) { bar(i); } // ok
}
5 голосов
/ 28 февраля 2014

Имя, которое начинается с оператора разрешения области действия (::), ищется в глобальном пространстве имен. Мы можем убедиться в этом, взглянув на черновик стандарта C ++ раздел 3.4.3 поиск квалифицированного имени параграф 4 , в котором написано ( выделение мое ) :

Имя с префиксом унарного оператора области :: (5.1) ищется в глобальной области , в единице перевода, где оно используется. Имя должно быть объявлено в глобальной области имен или должно быть именем, объявление которого видно в глобальной области действия из-за директивы using (3.4.3.2). Использование :: позволяет ссылаться на глобальное имя, даже если его идентификатор был скрыт (3.3.10).

Как гласит стандарт, это позволяет нам использовать имена из глобального пространства имен , которые в противном случае были бы скрыты , пример из связанного документа выглядит следующим образом:

int count = 0;

int main(void) {
  int count = 0;
  ::count = 1;  // set global count to 1
  count = 2;    // set local count to 2
  return 0;
}

Формулировка очень похожа на N1804 , который является самым ранним доступным проектом стандарта.

3 голосов
/ 16 сентября 2008

Если у вас уже есть функция с именем foo () в локальной области, но вам нужно получить доступ к ней в глобальной области.

2 голосов
/ 16 сентября 2008

Мой c ++ ржавый, но я считаю, что если у вас есть функция, объявленная в локальной области видимости, например, foo () и одна в глобальной области видимости, foo () ссылается на локальную. :: foo () будет ссылаться на глобальный.

1 голос
/ 16 сентября 2008

относится к глобальной области действия

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