Почему `::` называется 'оператором разрешения контекста', когда он не действует как оператор? - PullRequest
0 голосов
/ 05 июля 2018

Я не могу вспомнить случай, когда использование :: для определения области действия приведет к генерированию любого кода. Любой другой оператор, о котором я могу думать, на самом деле (по крайней мере концептуально) генерирует код, он «что-то делает».

Так почему :: называется «оператором разрешения области видимости» , когда он никоим образом не ведет себя как оператор . Для меня это больше похоже на часть имени, немного лексического пуха, такого как ... или < и >, окружающих список параметров шаблона, или даже ;. Никто не называет ; «оператором завершения выражения».

Есть ли конкретная причина, по которой это называется (цитата из стандарта о том, как он как-то ведет себя так, как здесь будет в порядке оператора)? Или название просто исторический багаж?

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Но является оператором, как, например, оператор выбора члена .:

#include <iostream>
int n;
int main()
{
    int n = 1;
    std::cout << ::n << " " << n;
}

и

#include <iostream>
struct N {
    int n = 1;
    operator int() const {return 0;}
};
int main()
{
    N n;
    std::cout << n << " " << n.n;
}

Вывод одинаков в обоих случаях.

0 голосов
/ 05 июля 2018

В случае, если вас особенно беспокоит термин «область действия», он ссылается на объявление (определение области действия). Блок операторов, заключенный в фигурные скобки, также определяет область объявления. Ни один идентификатор не может быть доступен за пределами области его декларации, если фактическая область не будет правильно разрешена. Идентификаторы, вложенные в безымянные области (например, блоки операторов), навсегда скрыты в их области определения. Но идентификаторы в областях имен могут ссылаться извне через цепочку областей вложенности соответственно с помощью «оператора разрешения области видимости». Он называется оператором, потому что он работает с 2 (или 1) идентификаторами, чтобы привести к ссылочной привязке во время компиляции. Сравните его с оператором доступа к элементу (точка), который создает вызываемую привязку. И, пожалуйста, не открывайте дверь герменевтике, мы не практикуем философию на этом форуме.

0 голосов
/ 05 июля 2018

Операторы в C или C ++ не обязаны генерировать код. Операторы, которые не включают, но не ограничиваются ими, sizeof, alignof и даже некоторые варианты использования & (например, для типов, которые переходят в указатели).

...