一、内联命名空间介绍
在C++11标准中加入了内联命名空间的概念,注意在第一层命名空间中是不能加入inline关键字的,如下图Parent命名空间是不能加inline关键字的。
#include <iostream>
using namespace std;
namespace Parent {
namespace Child1 {
void foo() {
cout<<"child1::foo()"<<endl;
}
}
inline namespace Child2 {
void foo() {
cout<<"child2::foo()"<<endl;
}
}
}
内联命名空间可以把子命名空间里的元素导入到父命名空间中。
使用Child1中的函数我们需要Parent::Child1::foo();
使用Child2中的函数就没那么复杂了,只需要Parent::foo();就可以
二、内联命名空间的作用
namespace Parent {
namespace V1 {
void foo() {
cout<<"foo 1.0"<<endl;
}
}
inline namespace V2 {
void foo() {
cout<<"foo 2.0"<<endl;
}
}
}
int main() {
Parent::foo();
}
如上图Parent命名空间中有两个命名空间,分别是V1和V2,因为我们想去维护升级这个函数,但是我们也不想让使用这一套函数的用户去修改他们的代码,那这个时候我想把他的版本1切换为版本2,我们只需要将老版本V1中的inline关键字去掉,把inline关键字转移到V2中就可以了,这样用户的代码是不需要调整的。
总体来说,内联命名空间对库的作者是比较友好的。是方便库的作者去管理代码,很多情况下是方便库的作者升级代码之后无缝的提供给使用者。
三、嵌套命名空间的简化语法
在C++11中我们可以用更简洁的语法去声明嵌套的命名空间,如:
namespace A::B::C {
int foo() {
return 1;
}
}
等价于
namespace A {
namespace B {
namespace C {
int foo() {
return 1;
}
}
}
}
在C++17标准中,没有标准说简洁的定义嵌套的内联命名空间,直到C++20才得以支持。如下图所示。
namespace A::B {
inline namespace C {
int foo() {
return 1;
}
}
}
等价于
namespace A::B::inline C {
int foo() {
return 1;
}
}
注意:最外层命名空间也就是A命名空间是不能加入inline关键字的。
嵌套命名空间的简化语法目的是减少代码冗余。