内联命名空间

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