范围解析运算符的求值

The evaluation of a scope resolution operator

本文关键字:运算符 范围      更新时间:2023-10-16

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

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

2)MyClass::foo();

以下是我的问题:
1. c++编译器如何区分它们?
2. 当c++编译器看到作用域解析操作符时,它的处理过程是什么?

详细信息请参见c++规范3.4.3限定名称查找(与3.3.1声明区域和作用域5.1.1(主表达式)通用也提供了一些有用的信息)

总之,名称空间和类都是"声明性区域",因此在您的示例中,std::cout指的是名为std的声明性区域中的名称cout,而MyClass::foo指的是名为MyClass的声明性区域中的名称foo。就::运算符而言,名称空间和类是"同一类东西"。

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

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

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