内联命名空间
Version >= C++ 11
inline namespace
包含封闭命名空间中内联命名空间的内容,因此
namespace Outer
{
inline namespace Inner
{
void foo();
}
}
大多相当于
namespace Outer
{
namespace Inner
{
void foo();
}
using Inner::foo;
}
但是来自 Outer::Inner::
的元素和与 Outer::
相关的元素是相同的。
所以跟随是等价的
Outer::foo();
Outer::Inner::foo();
替代 using namespace Inner;
对于模板专业化的一些棘手部分是不相同的:
对于
#include <outer.h> // See below
class MyCustomType;
namespace Outer
{
template <>
void foo<MyCustomType>() { std::cout << "Specialization"; }
}
-
内联命名空间允许
Outer::foo
的专业化// outer.h // include guard omitted for simplification namespace Outer { inline namespace Inner { template <typename T> void foo() { std::cout << "Generic"; } } }
-
而
using namespace
不允许Outer::foo
的专业化// outer.h // include guard omitted for simplification namespace Outer { namespace Inner { template <typename T> void foo() { std::cout << "Generic"; } } using namespace Inner; // Specialization of `Outer::foo` is not possible // it should be `Outer::Inner::foo`. }
内联命名空间是一种允许多个版本共存和默认为 inline
的方法
namespace MyNamespace
{
// Inline the last version
inline namespace Version2
{
void foo(); // New version
void bar();
}
namespace Version1 // The old one
{
void foo();
}
}
随着使用
MyNamespace::Version1::foo(); // old version
MyNamespace::Version2::foo(); // new version
MyNamespace::foo(); // default version : MyNamespace::Version1::foo();