什么是名称查找机制?

Ale*_*lex 8 c++

我想知道C++名称查找机制是什么.

Joh*_*itb 14

名称查找是识别名称含义的过程.名称查找有两个目的

  • 消除对代码的解析
  • 确定代码的精确含义

例如,如果你有这个代码

T(a);
Run Code Online (Sandbox Code Playgroud)

它取决于是否T是一个类型:如果它是一个类型,它将是一个声明a,如果它不是一个类型,它被解释为一个函数调用.

某些名称表示类型或模板.通常,只要遇到名称,就必须在继续解析包含它的程序之前确定该名称是否表示这些实体之一.确定此过程的过程称为名称查找.

名称查找将名称的使用与该名称的声明(3.1)相关联.

有两个主要的名称查找类

  • 非限定名称查找:从当前作用域开始,查找名称,如果在类中,则转义为封闭的作用域和基类.不从特定的命名范围开始.一旦找到名称,此查找表单就会停止.因此,内部作用域(或类)中的名称隐藏了在外部作用域(或基类)中找到的名称.
  • 限定名称查找:使用::运算符查看给定范围内的名称.

存在其他几种形式,例如查找出现在点或箭头之后的名称(如ptr->foo)或查找名称class foo(忽略非类型名称).一个特别有趣的形式是参数依赖查找,用于根据函数调用中使用的参数类型查找函数声明.

在名称查找找到一个声明后,它会检查它获得了什么属性以及程序是否可以使用它.

只有在名称查找之后,函数重载解析(如果适用)和访问检查成功才会在表达式处理中进一步使用名称声明引入的属性

因此,名称查找将找到私有类成员,但如果您使用此类名称,如果您无法访问它们,则会拒绝您的代码.即使基类具有与公共访问相同的名称,也是如此 - 这是因为如果找到名称,则名称查找在派生类中停止.


Jon*_*vis 1

从本质上讲,它是编译器用来确定给定名称对应的内容的过程 - 无论是变量、函数还是其他语言构造。它必须找到名称所指的底层语言结构。

例如,当您调用函数printf()时,编译器必须找到printf的声明,以便它了解它是什么并可以正确编译它。

正如前面所指出的,C++ 使用了各种名称查找机制,您可以使用 google 轻松找到有关它们的信息。维基百科也有一些基本信息: http: //en.wikipedia.org/wiki/Name_resolution