为什么 `::` 不像运算符那样被称为 'scope resolution operator'?

Why is `::` called the 'scope resolution operator' when it doesn't act like an operator?

我想不出使用 :: 指定范围会导致生成任何代码的情况。我能想到的每个其他运算符实际上(至少在概念上)生成代码,它 'does something'.

那么为什么 :: 被称为 'scope resolution operator' ,因为它的行为根本不像运算符 。在我看来,它更像是名称的一部分,有点像 ... 或围绕模板参数列表的 <>,甚至是 ; 的一些词汇。没有人称 ; 为 'expression termination operator'。

它被这样称呼是否有特定原因(引用标准中关于它如何以某种方式表现得像运算符的引用在这里是有序的)?或者这个名字只是历史包袱?

生成代码不需要 C 或 C++ 中的运算符。不包括但不限于 sizeofalignof 的运算符,甚至 & 的某些用途(例如用于衰减为指针的类型)。

但它一个运算符,就像成员选择运算符 .:

#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;
}

两种情况下的输出相同。

如果您特别关注术语'scope',它指的是声明(定义范围)。一个语句块——用大括号括起来——也定义了一个声明范围。 除非正确解析实际范围,否则不能在其声明范围之外访问任何标识符。嵌套在未命名范围(例如语句块)中的标识符永远埋在它们的定义范围中。但是名称范围内的标识符可以分别通过嵌套范围的链接从外部引用,方法是 'scope resolution operator'。它被称为运算符,因为它对 2(或 1)个标识符进行操作以产生编译时引用绑定。将其与创建可调用绑定的成员访问(点)运算符进行比较。 请不要打开解释学的大门,我们不是在这个论坛上实践哲学。