这可能是一个愚蠢的问题
我注意到我们对命名空间和静态成员函数使用范围解析运算符::
。
1)
std::printf("foo");
2)
MyClass::foo();
以下是我的问题:
1. C ++编译器如何区分它们?
2.当C ++编译器看到范围解析运算符时,它的过程是什么?
答案 0 :(得分:2)
gory详细信息在C ++规范的 3.4.3限定名称查找中( 3.3.1声明区域和范围和 5.1.1(主要)表达式)一般也提供了一些有用的信息。)
但是,为了简化它,名称空间和类都是"声明区域",因此在您的示例中,std::cout
引用名为{的声明性区域中的名称cout
{1}},std
引用名为MyClass::foo
的声明性区域中的名称foo
。就MyClass
运算符而言,名称空间和类是"相同类型的东西"。
此外,由于名称在声明性区域(包括全局命名空间)中必须是唯一的,因此以下代码无效:
::
换句话说,//invalid code - does not compile
namespace test { int x; }
class test { static int x; };
引用命名空间中的x或类中的x之间没有歧义。