当命名空间是匿名命名空间?我用于测试的大多数帮助程序函数都位于未命名的命名空间中,它违反了上述规则。
例:
namespace
{
template <typename T>
T template_func(T arg)
{
return arg;
}
class foo {};
}
int main()
{
return template_func(0);
}
我如何绕过上述内容,以满足规则?
作为他们示例中的状态,您可以使用额外的命名空间,如下所示:
namespace
{
template< class T >
T template_func(T arg) { return arg; }
namespace X
{
class foo{};
}
using X::foo;
}
int main()
{
return template_func(0);
}
我猜它的目的不是污染全局命名空间,而是为了避免类从属于同一命名空间的通用模板中获取奇怪的匹配项。
它遵循 cpp 核心准则 T.47:避免使用通用名称的高度可见的不受约束的模板
具体说来:
原因: 不受约束的模板参数与任何内容都完美匹配,因此此类模板可以优先于需要少量转换的更具体的类型。当使用 ADL 时,这尤其烦人/危险。通用名称使此问题更有可能发生。
注意: 如果在与类型相同的命名空间中定义了不受约束的模板,则 ADL 可以找到该不受约束的模板(如示例中发生的那样)。也就是说,它是高度可见的。
至于如何绕过它,Jarod42 在他的答案中以一个例子排名第一。