Подтвердить что ты не робот

Оператор с неограниченной разрешающей способностью

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

::foo();
4b9b3361

Ответ 1

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

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() для перехода к глобальной версии функции.

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

ссылаясь на глобальную область

Ответ 6

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