C++ 内联命名空间

示例

C ++ 11

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