这可能是个愚蠢的问题。
我注意到我们对命名空间和静态成员函数都使用范围解析运算符 ::
。
1)
std::printf("foo");
2)
MyClass::foo();
这是我的问题:
1. C++ 编译器如何区分它们?
2. 当 C++ 编译器看到范围解析运算符时,它的过程是什么?
最佳答案
血淋淋的细节在 C++ 规范的 3.4.3 合格名称查找中(3.3.1 声明区域和范围 和 5.1.1(主要expressions) General 也提供了一些有用的信息。)
归根结底,命名空间和类都是“声明性区域”,因此在您的示例中,std::cout
指的是名称 cout
声明区域名为 std
,MyClass::foo
引用名为 MyClass
的声明区域中的名称 foo
。就 ::
运算符而言, namespace 和类是“同一类事物”。
此外,由于名称在一个声明区域内(包括全局命名空间)必须是唯一的,所以下面的代码是无效的:
//invalid code - does not compile
namespace test { int x; }
class test { static int x; };
换句话说,test::x
引用命名空间中的 x 或类中的 x 之间没有歧义。
关于c++ - 范围解析运算符的评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40543624/