为什么我可以使用std命名空间中的名称,即使我“正在使用命名空间std;”?
算法头文件中不是已经有max函数了吗?和 by using namespace std;,我将函数导入到全局命名空间(它接受参数,在这种情况下两者都是整数,所以它不应该是一个重载)。
那么为什么没有任何命名冲突呢?
#include <iostream>
#include <algorithm>
using namespace std;
int max(int a, int b)
{
return (a > b) ? a : b;
}
int main()
{
cout << max(5, 10) << endl;
}
回答
那么为什么没有任何命名冲突呢?
您正在声明一个 non-template max,并且std::max是一组重载的函数模板,因此它们都被重载了。并且这里在重载解析中选择了全局命名空间中声明的非模板版本。
如果 F1 的所有参数的隐式转换不比 F2 的所有参数的隐式转换差,则确定 F1 是比 F2 更好的函数,并且
...
- 或者,如果不是这样,F1 是非模板函数,而 F2 是模板特化
...
回答
通过
using namespace std我将函数导入到全局命名空间
这是一个普遍的误解。没有什么是进口的。事实上,将指令using namespace std;放在全局命名空间中意味着在全局命名空间中查找名称时,也会在 namespace 中查找该名称std。
该std::max函数仍在命名空间中std,不在全局命名空间中。
您的声明max很好,因为您声明::max哪个是std::max.
当您进行不合格的函数调用时 max,名称会在全局命名空间中查找,也在namespace std.
这两个查找的结果导致一个重载集,其中包含所有调用函数的签名::max和std::max。
然后重载决议从重载集中为提供的参数选择最佳匹配,结果证明这::max是更好的匹配,因为非模板函数比函数模板更好匹配,所有其他条件都相同。
THE END
二维码