it-swarm-ru.tech

оператор разрешения области без области

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

::foo();
50
Landon Kuhn

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

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 (), чтобы получить глобальную версию функции.

64
Mark

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

void bar() {};
class foo {
    void bar(int) {};
    void foobar() { bar(); } // won't compile needs ::bar()
    void foobar(int i) { bar(i); } // ok
}
7
Matt Price

Имя, которое начинается с оператор разрешения области видимости (::), ищется в глобальном пространстве имен. Мы можем убедиться в этом, посмотрев раздел черновик стандарта 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 , который является самым ранним доступным проектом стандарта.

5
Shafik Yaghmour

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

3
Drealmer

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

2
itsmatt

ссылаясь на глобальную сферу

1
shoosh