寻求关于内联命名空间的说明

时间:2018-04-30 00:47:25

标签: c++ c++11 namespaces inline-namespaces

cppreference中,找到以下文字:

  

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

     

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

这些陈述意味着什么?有人可以通过一个简单的例子来解释吗?

1 个答案:

答案 0 :(得分:2)

考虑一个愚蠢的例子:

#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中存在默认实现。

这个例子没用,但考虑一个你想在外部库(包括stl)中专门化template函数或class的场景。您不知道vectorstd还是std::cxx11的成员(libc ++对许多事情都使用std::__1)。由于inline namespace是一种在API级别提供版本控制的方式(例如,您将inline namespace更改为v2并单独留下v1),因此最终用户可以专门化不知道inline d namespace s。

的详细信息