C++11~20核心特性(2)内联和嵌套命名空间

1. 内联命名空间

C++11标准增强了命名空间的特性,提出了内联命名空间的概念。

1.1 使用方法

#include <iostream>
namespace Parent {
  namespace Child1
  {
    void foo() {}
  }

  inline namespace Child2
  {
    void foo() {}
  }
}

int main()
{
  Parent::Child1::foo();

  // 相当于调用Child2::foo()
  Parent::foo();
}
  • Child1不是一个内联命名空间,所以调用Child1的foo函数需要明确指定所属命名空间。
  • 调用Child2的foo函数直接指定父命名空间即可。

1.2 用途

namespace LibXXX {
  namespace V1 {
    void foo() {}
  }

  inline namespace V2 {
    void foo() {}
  }
}

int main()
{
  LibXXX::foo();
}
  • 假设某个库LibXXX提供了foo接口
  • 用户通过LibXXX::foo调用库函数内联版本
  • 当某天库函数升级foo接口时,可以新增V3内联命名空间,将V2前面的inline删除
  • 这样用户代码不需要改变,自动升级到最新版本
  • 如果用户还想使用老版本,可以显式指定,例如:Parent::V1::foo

2. 嵌套命名空间

C++17标准允许使用一种更简洁的形式描述嵌套命名空间。

2.1 使用方法

例如:

namespace A::B::C {
  void foo() {}
}

等价于:

namespace A {
  namespace B {
    namespace C {
      void foo() {}
    }
  }
}

2.2 带内联命名空间的嵌套

C++20标准支持嵌套命名空间中包含内联命名空间。

例如:

namespace A::B::inline C {
  void foo() {}
}

// 或者
namespace A::inline B::C {
  void foo() {}
}

注意,第一个命名空间不可以是inline, 例如:inline A::B::C是错误的。

建站  ·  开发  ·  读书  ·  教程
↑长按或扫码关注“编程之海”公众号↑
↑长按或扫码关注“编程之海”公众号↑
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论

0

0

337

0
希望看到您的想法,请您发表评论x