57 lines
7.8 KiB
HTML
57 lines
7.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>名字查找</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_lookup skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading">名字查找</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-language.html">language</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p>名字查找,是当程序中出现一个<a href="cpp-language-identifiers.html#.E5.90.8D.E5.AD.97">名字</a>时,将其与引入它的<a href="cpp-language-declarations.html">声明</a>联系起来的过程。</p>
|
|
<p>例如,为编译 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <a href="cpp-io-manip-endl.html"><span class="kw1791">std::<span class="me2">endl</span></span></a><span class="sy4">;</span></span></span>,编译器进行了:</p>
|
|
<ul>
|
|
<li>名字 <code>std</code> 的无限定的名字查找,找到了头文件 <code><iostream></code> 中的命名空间 std 的声明</li>
|
|
<li>名字 <code>cout</code> 的有限定的名字查找,找到了命名空间 <code>std</code> 中的一个变量声明</li>
|
|
<li>名字 <code>endl</code> 的有限定的名字查找,找到了命名空间 <code>std</code> 中的一个函数模板声明</li>
|
|
<li>名字 <code>operator <<</code> 的<a href="cpp-language-adl.html">实参依赖查找</a>,找到了命名空间 <code>std</code> 中的多个函数模板声明;和名字 <code>std::ostream::operator<<</code> 的有限定名字查找,找到了 <code>std::ostream</code> 类中的多个成员函数声明</li>
|
|
</ul>
|
|
<p>对于函数和函数模板的名字,名字查找可以将同一个名字和多个声明联系起来,而且可能从<a href="cpp-language-adl.html">实参依赖查找</a>中得到额外的声明。还会进行<a href="cpp-language-function_template.html">模板实参推导</a>,并将声明的集合交给<a href="cpp-language-overload_resolution.html">重载决议</a>,由它选择所要使用的那个声明。<a href="cpp-language-access.html">成员访问</a>的规则只会在名字查找和重载解析之后才被考虑,如果适用的话。</p>
|
|
<p>对所有其他的名字(变量,命名空间,类等等)的名字查找,程序只有在只产生单个声明的情况下才能编译。对某个作用域中的名字进行查找将寻找到该名字的所有声明,但有一种例外,被称作“ struct hack ”或“类型/非类型名字隐藏”:同一作用域中,某个名字的一些出现可以代表非 typedef 的 class/struct/union/enum 声明,而其他出现要么全都代表同一个变量、<span class="t-rev-inl t-since-cxx14"><span>非静态数据成员</span> <span><span class="t-mark-rev t-since-cxx14">(C++14 起)</span></span></span>或者枚举项,要么全都代表可能重载的函数或函数模板名。此情况下无错误,但类型名在查找中被隐藏(代码必须用<a href="cpp-language-elaborated_type_specifier.html">详述类型说明符</a>来访问它)。</p>
|
|
<h3><span class="mw-headline" id=".E6.9F.A5.E6.89.BE.E7.9A.84.E7.B1.BB.E5.9E.8B">查找的类型</span></h3>
|
|
<p>如果名字紧跟在作用域解析运算符 <code><b>::</b></code>,或可能跟在 <code><b>::</b></code> 之后的消歧义关键词 <code>template</code> 的右侧,参见</p>
|
|
<ul>
|
|
<li><a href="cpp-language-qualified_lookup.html">有限定的名字查找</a></li>
|
|
</ul>
|
|
<p>否则,请参见</p>
|
|
<ul>
|
|
<li><a href="cpp-language-unqualified_lookup.html">无限定的名字查找</a></li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>(其中对于函数名,还包括<a href="cpp-language-adl.html">实参依赖查找</a>)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<ul>
|
|
<li><a href="cpp-language-scope.html">作用域</a></li>
|
|
<li><a href="cpp-language-adl.html">实参依赖查找</a></li>
|
|
<li><a href="cpp-language-function_template.html">模板实参推导</a></li>
|
|
<li><a href="cpp-language-overload_resolution.html">重载决议</a></li>
|
|
</ul>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|