内联和嵌套命名空间

一、内联命名空间介绍

在C++11标准中加入了内联命名空间的概念,注意在第一层命名空间中是不能加入inline关键字的,如下图Parent命名空间是不能加inline关键字的。

#include <iostream>
using namespace std;

namespace Parent {
    namespace Child1 {
        void foo() {
            cout<<"child1::foo()"<<endl;
        }
    }
    inline namespace Child2 {
        void foo() {
            cout<<"child2::foo()"<<endl;
        }
    }
}

内联命名空间可以把子命名空间里的元素导入到父命名空间中。

使用Child1中的函数我们需要Parent::Child1::foo();

使用Child2中的函数就没那么复杂了,只需要Parent::foo();就可以

二、内联命名空间的作用

namespace Parent {
    namespace V1 {
        void foo() {
            cout<<"foo 1.0"<<endl;
        }
    }
    inline namespace V2 {
        void foo() {
            cout<<"foo 2.0"<<endl;
        }
    }
}
int main() {
    Parent::foo();
}

如上图Parent命名空间中有两个命名空间,分别是V1和V2,因为我们想去维护升级这个函数,但是我们也不想让使用这一套函数的用户去修改他们的代码,那这个时候我想把他的版本1切换为版本2,我们只需要将老版本V1中的inline关键字去掉,把inline关键字转移到V2中就可以了,这样用户的代码是不需要调整的。

总体来说,内联命名空间对库的作者是比较友好的。是方便库的作者去管理代码,很多情况下是方便库的作者升级代码之后无缝的提供给使用者。

三、嵌套命名空间的简化语法

在C++11中我们可以用更简洁的语法去声明嵌套的命名空间,如:

namespace A::B::C {
    int foo() {
        return 1;
    }
}

等价于

namespace A {
    namespace B {
        namespace C {
            int foo() {
                return 1;
            }
        }
    }
}

在C++17标准中,没有标准说简洁的定义嵌套的内联命名空间,直到C++20才得以支持。如下图所示。

namespace A::B {
    inline namespace C {
        int foo() {
            return 1;
        }
    }
}
等价于
namespace A::B::inline C {
    int foo() {
        return 1;
    }
}

注意:最外层命名空间也就是A命名空间是不能加入inline关键字的。

嵌套命名空间的简化语法目的是减少代码冗余。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值