內聯名稱空間
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();