命名空间
变体
操作

名称查找

来自 cppreference.com
< cpp‎ | 语言
 
 
C++ 语言
 
 

名称查找是程序中遇到一个名称时,将其与引入该名称的声明关联起来的过程。

例如,要编译std::cout << std::endl;,编译器会执行

  • 对名称 std 进行非限定名称查找,在头文件 <iostream> 中找到命名空间 std 的声明
  • 对名称 cout 进行限定名称查找,在命名空间 std 中找到一个变量声明
  • 对名称 endl 进行限定名称查找,在命名空间 std 中找到一个函数模板声明
  • 对名称 operator<< 进行依赖于参数的查找,在命名空间 std 中找到多个函数模板声明,以及对名称 std::ostream::operator<< 进行限定名称查找,在类 std::ostream 中找到多个成员函数声明。

对于函数和函数模板名称,名称查找可以将多个声明与同一个名称关联起来,并且可以通过依赖于参数的查找获得额外的声明。模板参数推断 也可以应用,并将声明集传递给重载解析,重载解析选择将要使用的声明。成员访问 规则(如果适用)仅在名称查找和重载解析之后才会考虑。

对于所有其他名称(变量、命名空间、类等),名称查找只能在声明同一个实体时才能关联多个声明,否则它必须生成一个单一的声明才能使程序编译。在作用域中查找一个名称会找到该名称的所有声明,有一个例外,称为“结构黑客”或“类型/非类型隐藏”:在同一个作用域内,名称的一些出现可能引用一个不是typedef的类/结构/联合/枚举的声明,而同一个名称的所有其他出现都引用同一个变量、非静态数据成员或枚举器,或者都引用可能重载的函数或函数模板名称。在这种情况下,不会出现错误,但类型名称会从查找中隐藏(代码必须使用详细类型说明符来访问它)。

[编辑] 查找类型

如果名称紧随作用域解析运算符 :: 的右侧出现,或者可能紧随 :: 之后,然后是 disambiguating 关键字 template,请参阅

否则,请参阅

[编辑] 缺陷报告

以下行为更改缺陷报告被追溯应用于以前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
CWG 2063 C++98 "结构黑客" 不会应用于类作用域(破坏 C 兼容性) 已应用
CWG 2218 C++98 对非函数(模板)名称的查找无法关联
多个声明,即使它们声明同一个实体
允许

[编辑] 另请参阅

C 文档 for 查找和命名空间