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





ссылаясь на глобальную область видимости
Когда у вас уже есть функция с именем foo () в вашей локальной области, но вам нужно получить доступ к функции в глобальной области.
Мой С ++ ржавый, но я считаю, что если у вас есть функция, объявленная в локальной области, например foo () и одна в глобальной области, 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
}
Имя, которое начинается с оператор разрешения области видимости (::), ищется в глобальном пространстве имен. Мы можем увидеть это, посмотрев на раздел черновик стандарта C++3.4.3Поиск квалифицированного имени, параграф 4, в котором говорится (акцент мой):
A name prefixed by the unary scope operator :: (5.1) is looked up in global scope, in the translation unit where it is used. The name shall be declared in global namespace scope or shall be a name whose declaration is visible in global scope because of a using-directive (3.4.3.2). The use of :: allows a global name to be referred to even if its identifier has been hidden (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, который является самым ранним доступным проектом стандарта.
Почему он не компилируется?