首页 > 解决方案 > 寻求对内联命名空间的澄清

问题描述

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

内联命名空间的每个成员都可以部分特化、显式实例化或显式特化,就好像它是封闭命名空间的成员一样。

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

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

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

解决方案


考虑一个愚蠢的例子:

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

这个例子没有用,但是考虑一个你想要专门化一个template函数或class在一个外部库(包括 stl)中的场景。您不知道是否vectorstdor的成员std::cxx11(libc++std::__1用于许多事情)。由于 aninline namespace是一种在 API 级别提供版本控制的方法(例如,您更改inline namespacetov2并保持不变),这让最终用户可以在不知道dv1细节的情况下进行专业化。inlinenamespace


推荐阅读