【问题标题】:The evaluation of a scope resolution operator范围解析算子的评估
【发布时间】:2016-11-11 08:05:43
【问题描述】:

这可能是一个愚蠢的问题。
我注意到我们对命名空间和静态成员函数都使用了范围解析运算符 ::

1) std::printf("foo");

2) MyClass::foo();

这是我的问题:
1. C++ 编译器如何区分它们?
2. C++编译器看到作用域解析操作符的过程是什么?

【问题讨论】:

  • 对于您的第一个问题,在您展示的示例中,一切都与上下文有关。您的第二个问题是在 SO 上广泛解释的方式,并且对于不了解编译器如何工作的任何人都很难做到。
  • 有没有一种情况是我们使用类函数而不实例化java之类的对象?
  • static 成员函数。
  • 我稍微修改了这个问题。我说的是静态成员函数。
  • 即使在您编辑之后,第二个示例也没有调用静态成员函数。它看起来仍然更像是一个成员函数定义。

标签: c++ class namespaces


【解决方案1】:

血淋淋的细节在 C++ 规范的 3.4.3 限定名称查找中(3.3.1 声明性区域和范围5.1.1(主要表达式)一般也提供了一些有用的信息。)

不过,归根结底,命名空间和类都是“声明性区域”,因此在您的示例中,std::cout 指的是名为 std 的声明性区域中的名称 coutMyClass::foo 指的是在名为 MyClass 的声明性区域中的名称 foo。就:: 运算符而言,命名空间和类是“同一类事物”。

此外,由于名称在声明性区域(包括全局命名空间)内必须是唯一的,因此以下代码无效:

//invalid code - does not compile
namespace test { int x; }
class test { static int x; };

换句话说,test::x 引用命名空间中的 x 或类中的 x 之间没有歧义。

【讨论】:

  • 这就是我要找的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2010-09-09
  • 2012-04-20
  • 2011-06-07
  • 1970-01-01
  • 2010-10-03
相关资源
最近更新 更多