inline namespace name的作用就是将该名字空间里的变量的范围导入到父命名空间里。
如果是普通的命名空间套命名空间,现在子命名空间里有一个模板类,如果我想要去特化模板类的一个版本,则无法编译通过,但是如果用了inline的话,子命名空间里的变量和类和函数等等就会被导入到父命名空间里。
主要有两个作用,所以c++11引入了这个特性。
可以根据编译环境的不同,条件导入不同的名空间。比如A::A1, A::A2。则我们可用宏来控制inline这个属性,这样子,可在名空间A中导入不同的子命名空间。
因为程序库在长期的发展中,可能版本间的接口和实现等都随着程序库的发展而发生了变化,那么根据需要将合适的名字空间导入到父命名空间,会方便库的使用。
匿名的名字空间,同样可以把其包含的名字导入到父名字空间,但是无法允许在父命名空间对模板进行特化。
c++语言还有个特性,叫做ADL(Argument Dependent name LookUp)参数关联名称查找。
这个特性允许编译器在名字空间内找不到函数名称的时候,在参数的命名空间内查找函数名字。
ADL带来了一些使用的便利,但是也在一定程度上破坏了namespace 的封装性。
网友评论