2

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

那么,当它的行为与 operator 完全不同时,为什么将其::称为“范围解析运算符” 。在我看来,它更像是名称的一部分,有点像或围绕模板参数列表的词汇绒毛,甚至. 没有人称“表达式终止运算符”。...<>;;

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

4

3 回答 3

8

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

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

两种情况下的输出是相同的。

于 2018-07-05T19:58:17.843 回答
3

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

于 2018-07-05T19:54:29.833 回答
2

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

于 2018-07-05T20:26:04.800 回答