范围解析运算符的求值
The evaluation of a scope resolution operator
这可能是个愚蠢的问题。
我注意到我们对命名空间和静态成员函数都使用了范围解析运算符::
。
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之间没有歧义。
相关文章:
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?
- ::(范围解析运算符)前面没有任何东西
- 使用范围解析运算符时,在构造函数中调用虚拟方法是否安全?
- 迭代器的范围 TS 和 C++20 概念是否需要能够使用"运算符>"?
- 运算符重载中的范围运算符
- 重载运算符 [] 以接受范围
- 为什么按位运算符在使用与整数中提供的位数相同的位数计算可能的最大范围时会产生错误
- 为什么C++找不到布尔运算符,当有一个!范围内的运算符?
- 运算符>的范围
- 范围分辨率运算符在类型:: var的情况下返回什么
- 如何在C 中访问无范围分辨率运算符的标头构件类型
- 为什么我们要把 :: (范围重新定位运算符)放在迭代器之前
- 删除复制构造函数和运算符=类范围访问
- 为什么可以使用范围运算符和类 A 名称在类 B 中访问类 A(公共)中的枚举
- 友元运算符中的变量范围
- C++是否提供了一种在没有范围解析运算符的情况下访问类中的类的方法?
- 范围分辨率运算符被两次使用
- 基于范围的循环使用另一个运算符
- 关于在 STL 中使用范围解析运算符的困惑
- 为什么范围解析运算符在类外给出错误