为什么我可以使用 std 命名空间中的名称,即使我“正在使用命名空间 std;”?

Ami*_* A. 4 c++ namespaces 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;
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 5

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

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

如果 F1 的所有参数的隐式转换不比 F2 的所有参数的隐式转换差,则确定 F1 是比 F2 更好的函数,并且

...

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

...


M.M*_*M.M 5

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

这是一个普遍的误解。没有什么是进口的。事实上,将指令using namespace std;放在全局命名空间中意味着在全局命名空间中查找名称时,也会在 namespace 中查找该名称std

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

您的声明max很好,因为您声明::max哪个是std::max.

当您进行不合格的函数调用时 max,名称会在全局命名空间中查找,也在namespace std.

这两个查找的结果导致一个重载集,其中包含所有调用函数的签名::maxstd::max

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