当前位置: 首页 > news >正文

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

何谓 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.mrgr.cn/news/40851.html

相关文章:

  • 面试题1-fail-safe机制与fail-fast 机制
  • JavaScript Set基础与实战应用
  • 使用容器启动的zk无法暴露3888问题解决
  • 您的计算机已被Lockbit3.0勒索病毒感染?恢复您的数据的方法在这里!
  • 【论文阅读】基于真实数据感知的模型功能窃取攻击
  • 内存对齐的原理和使用
  • 使用 Docker 制作 YashanDB 镜像:深度解析与实战指南
  • MongoDB 副本集搭建 【docker compose + 本机部署】【建议收藏起来】
  • Oracle架构之数据库备份和RAC介绍
  • 计算机毕业设计 家校互联管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • SpringCloudEureka实战:搭建EurekaServer
  • SigmaStudio控件Cross Mixer\Signal Merger算法效果分析
  • 代码随想录Day23—回溯2
  • XSS基础
  • Street View Synthesis with Gaussian Splatting and Diffusion Prior 学习笔记
  • 10月1日刷题记录
  • 网站集群批量管理-密钥认证与Ansible模块
  • 开发者在AIGC浪潮中的定位与策略
  • 15分钟学 Python 第32天 :测试与调试
  • 一级建造师备考攻略及一建各科老师推荐(各科四大金刚)