【问题标题】:Why is `::` called the 'scope resolution operator' when it doesn't act like an operator?为什么`::`不像操作符那样被称为“范围解析操作符”?
【发布时间】:2018-12-14 09:11:26
【问题描述】:

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

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

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

【问题讨论】:

  • “我能想到的每个其他运算符实际上(至少在概念上)都会生成代码”-sizeof 怎么样? :: 运算符是一个运算符,因为语言语法说它是。
  • 你还会怎么称呼它? “范围解析词汇模糊”没有那么重要。
  • 我不认为分隔符是正确的。它不分离,它意味着嵌套的成员资格。它更接近于.-> 符号,它们也被称为“运算符”。
  • @Downvoters 请告诉我们这个问题如何没有显示任何研究工作、不清楚或没有用处?
  • ; 的例子是一个有趣的例子。但是,在 C++ 和大多数其他语言(Pascal 除外)中,它不是表达式分隔符。它是一个表达式终止符

标签: c++ scope-resolution


【解决方案1】:

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

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

两种情况下的输出是一样的。

【讨论】:

  • 你和尼可波拉斯的结合有一个非常有趣的观点。您提到的所有运算符都不可重载。你是成员选择运算符的例子是一个很好的例子。它在很多方面都非常类似于作用域解析运算符。
  • @Omnifarious:如果 Stroustrup 得逞,则成员选择运算符 将是可重载的。
  • 是的。我知道有建议让它可重载。不过我不太喜欢这个主意。 :-/
  • @Omnifarious:确实,我希望到那时我已经退休了。
  • 成员解析运算符就是一个很好的例子,而且至少有人已经设想过重载它的事实,这使得:: 是一个运算符比任何人提出的其他任何东西都更清楚。
【解决方案2】:

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

【讨论】:

  • 我喜欢这个答案,但我区分sizeofalignof 的一种方法是它们是具有值的表达式。不过,以这种方式考虑,范围解析运算符有点像这样。
  • 我刚刚注意到一件有趣的事情。所提到的运算符都不是可重载的。
  • @Omnifarious:确实。 ::-&gt;. 都在某种意义上识别了一个对象。
  • @Omnifarious:嗯,&amp; 是可重载的,但我想我们都希望它不是。还有-&gt; 是可重载的,有些人甚至希望. 是可重载的。
  • 另外,我不认为-&gt; 是一个很好的例子,因为在C 中它完全等同于(*thing).member,并且指针解引用肯定是一个运算符。而且,事实上,-&gt; 中唯一可以重载的真正功能是指针取消引用部分。我什至可能更喜欢更改语言定义,这样-&gt; 就不能被重载,而是根据重载的operator *()(如果存在)来定义。
【解决方案3】:

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

【讨论】:

  • 你的意思是'解释学'?而且我认为谈论为什么事物以它们的方式命名是有趣和有用的。名称和类别是思想的挂钉。思考为什么某事物被命名为某个特定类别有助于更全面地理解语言,并有助于创造有用的新想法和概念。
  • 命名很深的问题。基本概念没有任何定义,但其他所有定义都依赖于它们。主要概念可以被描述,但不能被定义。运算符 - 在 C++ 的上下文中 - 是一个主要的概念。而且由于英语不是我的第一语言 - 即。我在其中学习逻辑的那个-如果我选择的术语不准确,我应该道歉。同样,这不是一个哲学论坛。
  • 或拼写;-)
  • @Bathsheba 别傻笑。我精通 5 种语言,C++ 是第二。接下来是英语。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2020-07-04
  • 1970-01-01
  • 2012-03-09
相关资源
最近更新 更多