首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我能够使用std名称空间中的名称,即使我正在“使用名称空间std;"?

为什么我能够使用std名称空间中的名称,即使我正在“使用名称空间std;"?
EN

Stack Overflow用户
提问于 2021-04-29 10:51:27
回答 2查看 138关注 0票数 5

算法头文件中不是已经有一个max函数了吗?通过using namespace std;,我将函数导入到全局命名空间(这需要参数,在本例中这两个函数都是整数,所以不应该是重载)。

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

代码语言:javascript
运行
复制
#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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-29 10:53:53

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

您正在声明一个非模板max,而std::max是一组重载的函数模板,因此它们都是重载的。并在过载分辨率中选择全局命名空间中声明的非模板版本。

如果F1的所有参数的隐式转换不逊于F2的所有参数的隐式转换,则F1被确定为比F2更好的函数,并且 ..。

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

..。

票数 5
EN

Stack Overflow用户

发布于 2021-04-29 11:01:44

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

这是一个常见的误解。没有东西是进口的。实际上,将指令using namespace std;放在全局命名空间中意味着,当在全局命名空间中查找名称时,该名称也会在命名空间std中查找。

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

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

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

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67315910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档