C++语言学习(2): name lookup 的概念

news/2024/10/21 13:16:09/

何谓 name lookup

C++ 中很重要的一个概念:name lookup。
当编译器在遇到一个 name 的时候, 会做查找(lookup),会把引入这个 name 的声明和它关联起来,具体来说,又包含两种类型的 lookup:

  • qualified lookup: 带限定的查找
  • unqualified lookup:不带限定的查找

对于 std::cout << std::endl ,编译器做了这些 name lookup:

  • 非限定查找,找到了 iostream 文件里的 std 命名空间
  • 限定查找,在 ostream 文件中找到了 std::cout 变量的声明
  • 限定查找,在 ostream 文件中找到了 std::endl 函数 的定义
    在这里插入图片描述

scope resolution operator

两个冒号挨着出现 :: 叫做 scope resolution operator, 中文意思是作用于解析操作符。

对于 name lookup:

  • 如果 name 不出现在 scope resolution operator 右侧, 那么就是执行 unqualified lookup,即 <name><name>::<blablabla> 的 name
  • 如果 name 出现在 scope resolution operator 右侧,那么就是 qualified lookup

具体规则又很多, 举一个最近遇到的:

在这里插入图片描述

class MemoryManager {
public:...void free(void *buffer) {if (buffer_info.find(buffer) == buffer_info.end()) {printf("Error: invalid address, not allocated from MemoryManager\n");return;}allocated_size -= buffer_info[buffer];buffer_info.erase(buffer);::free(buffer); // 这一行使用了 scope resolution operator}
};

为什么 MemoryManager::free() 内要使用 ::free() 而不是 free() ? 因为如果用 free() 会做 unqualified lookup,查询到当前函数本身,产生无限递归,这显然不是我们预期的。

Ref

https://en.cppreference.com/w/cpp/language/unqualified_lookup


http://www.ppmy.cn/news/1533314.html

相关文章

docker_阿里云镜像仓库

1.创建个人实例 登录阿里云——控制台——容器镜像服务——创建个人版实例 2.设置密码 设置后可在终端复制上图2测试 [rootserver ~]# sudo docker login --usernameyou_aliyun_name crpi-8y14tvgewmc6tisz.cn-hangzhou.personal.cr.aliyuncs.com Password: WARNING! Your …

【Linux】几种常见配置文件介绍

配置文件目录 linux 系统中有很多配置文件目录/etc/systemd/system、/lib/systemd/system 以及/usr/lib/systemd/system 等&#xff0c;这三者有什么样的关系呢&#xff1f; 以下是网络上找的资料汇总&#xff0c;并加了一些操作验证。方便后期使用 介绍 目录/lib/systemd/s…

咸鱼sign逆向分析与爬虫实现

目标&#xff1a;&#x1f41f;的搜索商品接口 这个站异步有点多&#xff0c;好在代码没什么混淆。加密的sign值我们可以通过搜索找到位置 sign值通过k赋值&#xff0c;k则是字符串拼接后传入i函数加密 除了开头的aff…&#xff0c;后面的都是明文没什么好说的&#xff0c;我…

iPhone使用技巧:如何恢复变砖的 iPhone 或 iPad

“我的 iPhone 16 一夜之间就变砖了&#xff0c;放在床上充电时没问题&#xff0c;但第二天早上屏幕变黑&#xff0c;没有反应&#xff0c;怎么修&#xff1f;”变砖的 iPhone 意味着设备已经变砖了。它无法开机或正常运行。这个问题会导致死机屏幕变蓝、变黑或变红。许多 iPho…

网络协议 TCP、UDP 和 HTTP

TCP 与 UDP TCP&#xff08;Transmission Control Protocol&#xff09;和UDP&#xff08;User Datagram Protocol&#xff09;是两个广泛使用的传输层协议&#xff0c;它们在数据传输的方式、可靠性和应用场景方面有显著的区别。 TCP 特点&#xff1a; 面向连接&#xff1…

【30天玩转python】数据分析与可视化

数据分析与可视化 数据分析是通过数据提取、整理和分析来发现有用信息的过程&#xff0c;而数据可视化则通过图形和图表的方式&#xff0c;将数据转化为视觉化信息&#xff0c;以便快速理解数据趋势和模式。本篇文章将介绍如何使用 Python 进行数据分析与可视化&#xff0c;重…

在 CentOS 安装 Python3.7 (没有弯路)

下载Python源码包 wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz安装前准备 安装依赖组件 yum -y install wget zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel xz-devel解压安装 解…

梦幻西游端游如何查看挂机进度,GameViewer远程随时手机畅玩梦幻西游

原来用手机就可以免费玩梦幻西游端游&#xff1f;还可以随时查看游戏进度&#xff01;如果你喜欢玩梦幻西游端游&#xff0c;有总觉得出门在外不方面携带电脑&#xff0c;要想用手机实现随时随地查看梦幻西游的挂机进度&#xff0c;可以用网易GameViewer远程这款专为游戏玩家设…