评估范围解析运算符

时间:2016-11-11 08:05:44

标签: c++ class namespaces

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

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

2) MyClass::foo();

以下是我的问题:
1. C ++编译器如何区分它们? 2.当C ++编译器看到范围解析运算符时,它的过程是什么?

1 个答案:

答案 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之间没有歧义。