inline namespace 在封闭的名称空间中包含内联名称空间的内容,因此
namespace Outer { inline namespace Inner { void foo(); } }
大部分相当于
namespace Outer { namespace Inner { void foo(); } using Inner::foo; }
但是from的元素Outer::Inner::和与之关联的元素Outer::是相同的。
所以跟随是等效的
Outer::foo(); Outer::Inner::foo();
using namespace Inner;对于某些棘手的部分,替代方法将不等同于模板专门化:
对于
#include <outer.h> // 见下文 class MyCustomType; namespace Outer { template <> void foo<MyCustomType>() { std::cout << "Specialization"; } }
内联名称空间允许对 Outer::foo
// 外部
// 包括卫队为简化起见
namespace Outer
{
inline namespace Inner
{
template <typename T>
void foo() { std::cout << "Generic"; }
}
}
而using namespace不允许专业化Outer::foo
// 外部
// 包括卫队为简化起见
namespace Outer
{
namespace Inner
{
template <typename T>
void foo() { std::cout << "Generic"; }
}
using namespace Inner;
// 无法对Outer :: foo进行专业化
// 它应该是`Outer :: Inner :: foo`。
}
内联名称空间是一种允许多个版本同居并默认为inline一个版本的方法
namespace MyNamespace { // 内联最新版本 inline namespace Version2 { void foo(); // 新版本 void bar(); } namespace Version1 // 老一 { void foo(); } }
并随着使用
MyNamespace::Version1::foo(); // 旧版本 MyNamespace::Version2::foo(); // 新版本 MyNamespace::foo(); // 默认版本:MyNamespace :: Version1 :: foo();