c++ - 为什么 C++ 需要作用域解析运算符?

标签 c++ operators language-design scope-resolution

(我知道范围解析运算符的作用,以及如何以及何时使用它。)

为什么 C++ 有 :: 运算符,而不是为此目的使用 . 运算符? Java 没有单独的运算符,并且工作正常。 C++ 和 Java 之间是否存在某些差异,这意味着 C++ 需要单独的运算符才能进行解析?

我唯一的猜测是 :: 是出于优先原因而需要的,但我想不出为什么它需要比 . 更高的优先级。我能想到的唯一情况就是这样

a.b::c;

将被解析为

a.(b::c);

,但我想不出像这样的语法在任何情况下都是合法的。

也许这只是“他们做不同的事情,所以他们看起来也不同”的例子。但这并不能解释为什么 ::. 具有更高的优先级。

最佳答案

因为 C++ 标准委员会中有人认为允许此代码运行是个好主意:

struct foo
{
  int blah;
};

struct thingy
{
  int data;
};

struct bar : public foo
{
  thingy foo;
};

int main()
{
  bar test;
  test.foo.data = 5;
  test.foo::blah = 10;
  return 0;
}

基本上,它允许成员变量和派生类类型具有相同的名称。当有人认为这很重要时,我不知道他们在抽什么。但它就在那里。

当编译器看到.时,它知道左边的东西一定是一个对象。当它看到 :: 时,它必须是类型名或 namespace (或什么都不是,表示全局 namespace )。这就是它解决这种歧义的方式。

关于c++ - 为什么 C++ 需要作用域解析运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49055070/

相关文章:

java - 在Java中使用C++模板框架

c# - 一般 C# 问题

c++ - 有没有办法使用 C++17 折叠表达式来实现它?

c++ - 在具有低级别访问权限的随身碟上写入

c++ - QTableWidget 列大小调整事件

c - "The only operator that gives back a value is the de-referencing operator"

c++ - ostream 引用运算符 <<

javascript - 如何在 Angular http 拦截器中以异步方式缓存 http 请求?

c# - 为什么必须在静态类中定义 C# 扩展方法?

python - 动态语言的用途