namespace是一种实体(entity)。实体还包括函数、变量、类型、对象等等,是预处理之后的语言提供的最基本的抽象。
一个namespace对应若干作用域(scope)称为namespace scope,可以在里面通过声明引入名称(name)。约定不同namespace之间的声明引入的名称是不同的名称,这可以有效防止重名(当然宏名不算,大不了#undef)导致的问题。因为同一个作用域中,通过一个声明引入一个名称之后这个名称指称(denoting)的实体就被确定了(要么它是类型、要么它是变量……),你没法去掉一个声明然后重新引入它。像C这样,当不同的文件中有重名的东西时就无法兼容,这给复用带来麻烦——不得不使用一堆罗嗦的前缀(namespace里面的一堆xxxx::相当于前缀的作用,但是可以在适当的情况下通过using来省略,不会太罗嗦)区分可能被重名的东西。一开始就用namespace来隔离各个可以容纳不同声明的的作用域,在某个非全局的namespace下声明你写的东西,复用别人在另外的namespace中写的东西,可以不造成冲突,也是比较清楚的做法。