代码之家  ›  专栏  ›  技术社区  ›  user9196120

寻求对内联命名空间的澄清

  •  1
  • user9196120  · 技术社区  · 8 年前

    在里面 cppreference ,找到以下文本:

    内联命名空间的每个成员都可以部分专用化, 显式实例化或显式专门化,就像它是 封闭命名空间的成员。

    注意:关于专门化的规则允许库版本控制: 库模板的不同实现可以在中定义 不同的内联命名空间,同时仍允许用户扩展 具有主命名空间的显式专门化的父命名空间 样板

    这些说法意味着什么?有人能用一个简单的例子来解释吗?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Stephen Newell    8 年前

    考虑一个愚蠢的例子:

    #include <iostream>
    
    namespace foo {
        inline namespace v1 {
            template <typename T>
            void bar(T t) {
                (void) t;
                std::cout << "Generic bar\n";
            }
        }
    
        template <>
        void bar<int>(int v) {
            (void) v;
            std::cout << "Specialized bar\n";
        }
    }
    
    int main() {
        foo::bar(12);
        foo::v1::bar(12);
        foo::bar(12.0);
        return 0;
    }
    

    如果运行此操作,将获得以下输出:

    Specialized bar
    Specialized bar
    Generic bar
    

    这是因为打电话 foo::bar 使用 int 专门从事 foo ,即使默认实现存在于 foo::v1

    这个示例是无用的,但请考虑一个场景,其中您想要专门化 template 功能或 class 在外部库(包括stl)中。你不知道 vector 是的成员 std std::cxx11 (libc++使用 std::__1 对于许多事情)。自 inline namespace 是在API级别提供版本控制的一种方法(例如,您更改 内联命名空间 v2 然后离开 v1 这使得最终用户可以在不知道 inline D namespace s

    推荐文章