由于历史原因,我有一个位于顶级命名空间的类。我需要为它定义一个函数,必须使用依赖于参数的查找找到 1 。顶级命名空间是否被视为此类的关联命名空间,还是我必须做一些解决方法?
1 否则使用它的模板可能找不到它,因为模板之后定义的符号仅在ADL找到时才会出现。
答案 0 :(得分:2)
全局命名空间在这方面并不特别,它就像任何其他命名空间一样工作,因此非常适合您的用例。
Live example 1全局命名空间工作。
Live example 2 ADL实际上是#1工作 1 的原因。
以下是实例的文字:
#include <iostream>
struct X {};
template <class T>
void bar(T t)
{
foo(t);
}
void foo(X x)
{
std::cout << "Foo\n";
}
int main()
{
X x;
bar(x);
}
1 这会失败,因为ADL无法找到该函数,而正常查找会失败。所以它证明#1真的有效,这要归功于ADL。
答案 1 :(得分:1)
以下是我对标准的看法:
来自[basic.lookup.argdep](2):
- 如果T是类类型(包括联合),则其关联的类是: 班级本身;它所属的成员,如果有的话;和它的 直接和间接基类。其关联的命名空间是 最关联的类的最里面的名称空间。
从[basic.namespace](2)(和定义global namespace
的3.3.6):
翻译单元的最外层声明区域是命名空间;见3.3.6。
所以我没有看到任何从ADL中排除全局命名空间的内容。