2016-11-11 91 views
0

这可能是一个愚蠢的问题。
我注意到我们对名称空间和静态成员函数都使用作用域分辨率运算符::范围解析运算符的评估

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

2) MyClass::foo();

这里是我的问题:
1.怎么会C++编译器区分它们呢?
2. C++编译器在看到范围解析运算符时的过程是什么?

+1

对于你的第一个问题,在你展示的例子中,它是关于上下文的。你的第二个问题在这里可以广泛地解释,因此对于没有编译器工作方式知识的任何人都很难做到。 –

+0

有没有我们使用类函数而没有实例化像java这样的对象的情况? –

+0

只有静态成员函数。 –

回答

2

底层细节是3.4.3限定名称查找的C++规范的(与3.3.1声明的区域和范围5.1.1(基本表达式)一般还提供了一些有用的信息。)

熬下来,不过,无论是命名空间和类是“声明区”,所以在你的榜样,std::cout指名cout名为std声明区,并MyClass::foo指名foo在声明区名为MyClass。就运营商而言,命名空间和类是“同类的东西”。

此外,由于名称必须是一个声明区(包括全局命名空间)中是唯一的,下面的代码是无效的:

//invalid code - does not compile 
namespace test { int x; } 
class test { static int x; }; 

换句话说,有test::x之间没有歧义指的是X在命名空间或类中的x。

+0

这就是我一直在寻找的东西。谢谢。 –