內聯名稱空間

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();