为什么当"::"的行为不像运算符时被称为'scope resolution operator'?

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

本文关键字:scope operator 被称为 resolution 运算符 为什么      更新时间:2023-10-16

我想不出使用::指定范围会导致生成任何代码的情况。我能想到的所有其他运算符实际上(至少在概念上(生成代码,它"做某事"。

那么,为什么::被称为"示波器解析运算符",而它的行为绝不像运算符。在我看来,它更像是名称的一部分,有点词汇绒毛,例如...或模板参数列表周围的<>,甚至是;。没有人称;为"表达式终止运算符"。

它被称为它是否有特定原因(标准中关于它如何以某种方式表现得像操作员一样的引用(?还是这个名字只是历史包袱?

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

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

两种情况下的输出相同。

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

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