В С++, какова цель оператора разрешения области видимости при использовании без области видимости? Например:
::foo();
В С++, какова цель оператора разрешения области видимости при использовании без области видимости? Например:
::foo();
Это означает глобальный охват. Возможно, вам придется использовать этот оператор, если у вас конфликтующие функции или переменные в одной области, и вам нужно использовать глобальный. У вас может быть что-то вроде:
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() для перехода к глобальной версии функции.
Также следует отметить, что разрешение имен происходит до разрешения перегрузки. Поэтому, если в вашей текущей области есть что-то с тем же именем, оно перестает искать другие имена и пытается их использовать.
void bar() {};
class foo {
void bar(int) {};
void foobar() { bar(); } // won't compile needs ::bar()
void foobar(int i) { bar(i); } // ok
}
Имя, которое начинается с оператора разрешения области видимости (::
), просматривается в глобальном пространстве имен. Мы можем это увидеть, посмотрев проект С++ 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, которая является самым ранним доступным стандартом проекта.
Если у вас уже есть функция с именем foo() в локальной области, но вам нужно получить доступ к ней в глобальной области.
ссылаясь на глобальную область
Мой С++ ржавый, но я считаю, что если у вас есть функция, объявленная в локальной области, например foo() и одна в глобальной области видимости, foo() ссылается на локальную.:: foo() будет ссылаться на глобальный.