为什么即使我"using namespace std;",我也可以在 std 命名空间中使用名称?



算法头文件中不是已经有max函数了吗? 通过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;
}

那么为什么没有任何命名冲突呢?

您正在声明一个非模板maxstd::max是一组重载的函数模板,因此它们都是重载的。并且在此处的重载解析中选择全局命名空间中声明的非模板版本。

如果隐式,F1 被确定为比 F2 更好的函数 F1 所有参数的转换并不比隐式参数差 F2 的所有参数的转换,以及

  1. 或者,如果不是这样,F1 是一个非模板函数,而 F2 是一个 模板专业化

通过using namespace std我将函数导入全局命名空间

这是一个常见的误解。不导入任何内容。 实际上,将指令using namespace std;放在全局命名空间中意味着在全局命名空间中查找名称时,也会在命名空间std中查找该名称。

std::max函数仍然在命名空间std中,它不在全局命名空间中。

您的max声明很好,因为您声明::max这是一个单独的实体std::max

当您进行非限定函数调用max时,将在全局命名空间中查找该名称,也会在namespace std中查找该名称。

这两个查找的结果都会导致一个重载集,该重载集由称为::maxstd::max的所有函数签名组成。

然后,重载解析从提供的参数的重载集中选择最佳匹配,事实证明::max是更好的匹配,因为非模板函数比函数模板更匹配,所有其他条件相同。

最新更新