Рассмотрим глупый пример:
#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 (например, вы изменяете свой inline namespace
на v2
и оставляете v1
в покое), это позволяет конечным пользователям специализироваться, не зная подробностей inline
д namespace
с.