C++ 寻求对内联名称空间的澄清

C++ 寻求对内联名称空间的澄清,c++,c++11,namespaces,inline-namespaces,C++,C++11,Namespaces,Inline Namespaces,在中,可以找到以下文本: 内联命名空间的每个成员都可以部分专用化, 显式实例化或显式专门化,就好像它是 封闭命名空间的成员 注意:关于专门化的规则允许库版本控制: 库模板的不同实现可以在中定义 不同的内联命名空间,同时仍允许用户扩展 具有主命名空间的显式专门化的父命名空间 模板 这些说法意味着什么?有人能用一个简单的例子来解释吗?想想一个愚蠢的例子: #include <iostream> namespace foo { inline namespace v1 {

在中,可以找到以下文本:

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

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


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

想想一个愚蠢的例子:

#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;
}
这是因为使用
int
调用
foo::bar
是专门用于
foo
的,即使默认实现存在于
foo::v1

这个例子是没有用的,但是考虑一个场景,您想在外部库(包括STL)中专门化<代码>模板函数或<代码>类< /代码>。您不知道

vector
是否是
std
std::cx11
的成员(libc++使用
std::u 1
进行许多操作)。由于
内联命名空间
是在API级别提供版本控制的一种方式(例如,您将
内联命名空间
更改为
v2
,而不使用
v1
),因此最终用户可以在不知道
内联命名空间
d
的详细信息的情况下进行专门化

Specialized bar
Specialized bar
Generic bar