在cppreference中,找到以下文字:
内联命名空间的每个成员都可以部分专门化, 明确地实例化或明确地专门化,就像它是一个 封闭命名空间的成员。
注意:有关特化的规则允许库版本控制: 可以在中定义库模板的不同实现 不同的内联命名空间,同时仍然允许用户扩展 父命名空间具有主要的显式特化 模板。
这些陈述意味着什么?有人可以通过一个简单的例子来解释吗?
答案 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
的场景。您不知道vector
是std
还是std::cxx11
的成员(libc ++对许多事情都使用std::__1
)。由于inline namespace
是一种在API级别提供版本控制的方式(例如,您将inline namespace
更改为v2
并单独留下v1
),因此最终用户可以专门化不知道inline
d namespace
s。