1. 内联命名空间
C++11标准增强了命名空间的特性,提出了内联命名空间的概念。
1.1 使用方法
#include <iostream>
namespace Parent {
namespace Child1
{
void foo() {}
}
inline namespace Child2
{
void foo() {}
}
}
int main()
{
Parent::Child1::foo();
// 相当于调用Child2::foo()
Parent::foo();
}
Child1不是一个内联命名空间,所以调用Child1的foo函数需要明确指定所属命名空间。 调用Child2的foo函数直接指定父命名空间即可。
1.2 用途
namespace LibXXX {
namespace V1 {
void foo() {}
}
inline namespace V2 {
void foo() {}
}
}
int main()
{
LibXXX::foo();
}
假设某个库LibXXX提供了foo接口 用户通过LibXXX::foo调用库函数内联版本 当某天库函数升级foo接口时,可以新增V3内联命名空间,将V2前面的inline删除 这样用户代码不需要改变,自动升级到最新版本 如果用户还想使用老版本,可以显式指定,例如:Parent::V1::foo
2. 嵌套命名空间
C++17标准允许使用一种更简洁的形式描述嵌套命名空间。
2.1 使用方法
例如:
namespace A::B::C {
void foo() {}
}
等价于:
namespace A {
namespace B {
namespace C {
void foo() {}
}
}
}
2.2 带内联命名空间的嵌套
C++20标准支持嵌套命名空间中包含内联命名空间。
例如:
namespace A::B::inline C {
void foo() {}
}
// 或者
namespace A::inline B::C {
void foo() {}
}
注意,第一个命名空间不可以是inline, 例如:inline A::B::C是错误的。