我没想到这段代码可以编译,但它确实编译了。我的理解是 func(d)
它在全局命名空间中查找名为“func”的函数,但也在任何传入参数的命名空间中查找(依赖于参数的查找)
但在这种情况下,参数位于全局命名空间中。那么为什么它会在 ns 命名空间中找到“func”呢?是否有特殊规则规定,如果参数类型是 typedef,则它使用基础类型的命名空间而不是实际参数的命名空间?
这似乎是真的,但我找不到任何支持这一点的东西……这是预期的行为吗?
namespace ns
{
struct data {};
void func(ns::data item) {}
};
// Create an alias "datatype" in the global namespace for ns::data
typedef ns::data datatype;
int main()
{
datatype d;
func(d);
}
最佳答案
参数d
是main
的本地参数。 datatype
只是类型 ns::data
的别名,因此 d
的类型为 ns::data
。
ns::data
是 ns
命名空间的 [直接] 成员,因此 ns
命名空间中的此函数将被考虑用于 ADL .
关于c++ - 参数相关名称查找和 typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13192947/