Оператор разрешения области видимости без области видимости

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

::foo();
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
60
0
10 911
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

ссылаясь на глобальную область видимости

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

Почему он не компилируется?

Lightness Races in Orbit 14.02.2014 14:09

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

DrumM 21.06.2017 15:33

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

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, который является самым ранним доступным проектом стандарта.

Другие вопросы по теме