考虑一个愚蠢的例子:
#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