美文网首页
[C++11阅读][2-5-1]内联名字空间

[C++11阅读][2-5-1]内联名字空间

作者: 凌霄阁2010 | 来源:发表于2020-06-14 00:06 被阅读0次

inline namespace

C++11新增的内联名字空间要解决的问题是,在父名字空间定义或特化子名字空间的模板。
我们看以下程序,有了inline修饰符,Other里就能特化Basic里的模板类,外层的Jim里也能特化Toolkit类了。

#include <iostream>
using namespace std;
namespace Jim {
    inline namespace Basic {
        struct Knife{ Knife() { cout << "Knife in Basic." << endl; } };
        class CorkScrew{};
    }
    inline namespace Toolkit {
        template<typename T> class SwissArmyKnife{};
    }
    // ...
    namespace Other {
        Knife b; // basic
        struct Knife { Knife() { cout << "Knife in Other" << endl; } };
        Knife c; // other
        Basic::Knife k; // basic
    }
}
namespace Jim {
    template<> class SwissArmyKnife<Knife>{};
}
using namespace Jim;
int main() {
    SwissArmyKnife<Knife> sknife;
}
/*
Knife in Basic.
Knife in Other
Knife in Basic.
*/

ADL

C++的一个语言特性是ADL,全称是Argument-Dependent name Lookup,参数关联名称查找,允许编译器在名字空间内找不到函数名字的时候,在参数的名字空间内进行查找。
比如下面的例子,我们在main函数里调用ADLFunc时没有加namespace,但编译不会报错,因为编译器在找不到ADLFunc这个符号时,会failover从参数a那里继续找。这个特性在C++98里也有的。

namespace ns_adl {
    struct A{};
    void ADLFunc(A a){}
}
int main() {
    ns_adl::A a;
    ADLFunc(a);
}

ADL在一定情况下可以解决inline namespace要解决的问题,带来了使用上的便利性,不过也在一定程度上破坏了namespace的封装性,有的人认为有负面影响。笔者也建议不要依赖这个特性,该加的namespace还是要加的。

相关文章

  • [C++11阅读][2-5-1]内联名字空间

    inline namespace C++11新增的内联名字空间要解决的问题是,在父名字空间定义或特化子名字空间的模...

  • 内联名字空间

    inline namespace name的作用就是将该名字空间里的变量的范围导入到父命名空间里。如果是普通的命名...

  • 内联函数,重载函数,参数默认的函数

    内联函数 内联函数和宏差不多,要是时间不要空间;关键字inline。内联函数中,不能有复杂的控制语句,比如if或f...

  • 2018-09-26

    命名空间 auto(since C++11) 引用c++==(附注:java里的变量都是reference)== ...

  • inline

    内联函数:inline 内联函数要解决的问题 为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题. 实际编...

  • c++ 11~20 新特性速查

    持续更新中。。。 c++11 std::auto (c++11) raw string (c++11) std::...

  • iOS开发中内联函数(UIKIT_STATIC_INLINE)的

    内联函数是一种小型函数,是以空间换效率的函数,功能较简单,即函数内部没有循环、开关语句等,内联函数的主要作用是在使...

  • 内联函数的使用

    内联函数是一种小型函数,是以空间换效率的函数,功能较简单,即函数内部没有循环、开关语句等,内联函数的主要作用是在使...

  • local() glocal()

    局部名字空间(只读) locals() 全局名字空间 globals()

  • 命名空间(namespace)

    命名空间,也称名称空间,名字空间。命名空间是用来组织和重构代码的。如同名字一样的意思,NameSpace(名字空间...

网友评论

      本文标题:[C++11阅读][2-5-1]内联名字空间

      本文链接:https://www.haomeiwen.com/subject/xlditktx.html