c++ - 范围解析运算符的评估

标签 c++ class namespaces

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

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声明区域名为 stdMyClass::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/

相关文章:

c++ - 关于套接字编程和多线程的面试问题

c++ - C+类错误输出

c++ - 好友功能仍然无法访问私有(private)成员

kubernetes - 创建命名空间后自动创建 Kubernetes 资源

c++ - 递归 std::functional 与递归匿名命名空间函数。使用哪一个?

C++ 函数作用域静态变量究竟何时初始化?

c++ - 这两种对象实例化方法有什么区别?

c++ - 在 C++ 的子类中强制执行静态方法重载

C++ 每个类方法在一个单独的文件中?

c# - 如何通过程序集获取项目中的所有命名空间?