475 lines
43 KiB
HTML
475 lines
43 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_declarations 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><i>声明</i>将名字引入(或再引入)到 C++ 程序中。每种实体的声明方式都不同。<a href="cpp-language-definition.html">定义</a>是足以使该名字所标识的实体被使用的声明。</p>
|
|
<p>声明是下列之一:</p>
|
|
<ul>
|
|
<li><a href="cpp-language-function.html#.E5.87.BD.E6.95.B0.E5.AE.9A.E4.B9.89">函数定义</a></li>
|
|
<li><a href="cpp-language-templates.html">模板声明</a>(包括<a href="cpp-language-partial_specialization.html">部分模板特化</a>)</li>
|
|
<li><a href="cpp-language-class_template.html#.E6.98.BE.E5.BC.8F.E5.AE.9E.E4.BE.8B.E5.8C.96">显式模板实例化</a></li>
|
|
<li><a href="cpp-language-template_specialization.html">显式模板特化</a></li>
|
|
<li><a href="cpp-language-namespace.html">命名空间定义</a></li>
|
|
<li><a href="cpp-language-language_linkage.html">链接说明</a></li>
|
|
<li>属性声明(<span class="t-spar"><a href="cpp-language-attributes.html">属性</a></span> <code><b>;</b></code>)<span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
<li>空声明(<code><b>;</b></code>)<span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
<li>无 <span class="t-spar">声明说明符序列</span> 的函数声明:</li>
|
|
</ul>
|
|
<table class="t-sdsc-begin"></table>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td class="t-sdsc-nopad"><span class="t-spar">属性</span><span class="t-mark">(可选)</span> <span class="t-spar">声明符</span> <code><b>;</b></code></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">属性</span></td>
|
|
<td>-</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span> 任意数量<a href="cpp-language-attributes.html">属性</a>的序列</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">声明符</span></td>
|
|
<td>-</td>
|
|
<td>函数声明符。</td>
|
|
</tr>
|
|
</table>
|
|
<dl>
|
|
<dd>此声明必须声明构造函数、析构函数或用户定义的类型<a href="cpp-language-cast_operator.html">转换函数</a>。它只能用作<a href="cpp-language-templates.html">模板声明</a>、<a href="cpp-language-template_specialization.html">显式特化</a>或显式实例化的一部分。</dd>
|
|
</dl>
|
|
<ul>
|
|
<li><span class="t-spar">块声明</span>(能在<a href="cpp-language-statements.html#.E5.A4.8D.E5.90.88.E8.AF.AD.E5.8F.A5">块</a>中出现的声明),它可以是下列之一:</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><a href="cpp-language-asm.html">汇编声明</a></li>
|
|
<li><a href="cpp-language-type_alias.html">类型别名声明</a> <span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
<li><a href="cpp-language-namespace_alias.html">命名空间别名定义</a></li>
|
|
<li><a href="cpp-language-using_declaration.html">using 声明</a></li>
|
|
<li><a href="cpp-language-namespace.html#using_.E6.8C.87.E4.BB.A4">using 指令</a></li>
|
|
<li><a href="cpp-language-enum.html#using_enum_.E5.A3.B0.E6.98.8E">using enum 声明</a> <span class="t-mark-rev t-since-cxx20">(C++20 起)</span></li>
|
|
<li><a href="cpp-language-static_assert.html">static_assert</a> 声明 <span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
<li><a href="cpp-language-enum.html">不可见 enum 声明</a> <span class="t-mark-rev t-since-cxx11">(C++11 起)</span></li>
|
|
<li>简单声明</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<h3><span class="mw-headline" id=".E7.AE.80.E5.8D.95.E5.A3.B0.E6.98.8E">简单声明</span></h3>
|
|
<p>简单声明是引入、创建并可选地初始化一个或数个标识符(典型地为变量)的语句。</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">声明说明符序列</span> <span class="t-spar">初始化声明符列表</span><span class="t-mark">(可选)</span> <code><b>;</b></code></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">属性</span> <span class="t-spar">声明说明符序列</span> <span class="t-spar">初始化声明符列表</span><code><b>;</b></code></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">属性</span></td>
|
|
<td>-</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span> 任何数量<a href="cpp-language-attributes.html">属性</a>的序列</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">声明说明符序列<br />
|
|
(decl-specifier-seq)</span></td>
|
|
<td>-</td>
|
|
<td><i>说明符(specifier)</i>的序列(见下文)</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">初始化声明符列表<br />
|
|
(init-declarator-list)</span></td>
|
|
<td>-</td>
|
|
<td>带可选的<i>初始化器(initializer)</i>的<i>声明符(declarator)</i>的逗号分隔列表。 <span class="t-spar">初始化声明符列表</span> 在声明具名的 class/struct/union 或具名枚举时是可选的</td>
|
|
</tr>
|
|
</table>
|
|
<p><span class="t-rev-inl t-since-cxx17"><span><a href="cpp-language-structured_binding.html">结构化绑定声明</a>也是简单声明。</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span></p>
|
|
<h3><span class="mw-headline" id=".E8.AF.B4.E6.98.8E.E7.AC.A6">说明符</span></h3>
|
|
<p><b>声明说明符</b>(<span class="t-spar">声明说明符序列</span>)是下列以空白分隔的说明符的序列,顺序不限:</p>
|
|
<ul>
|
|
<li><a href="cpp-language-typedef.html"><code>typedef</code></a> 说明符。如果存在,则整个声明是 <a href="cpp-language-typedef.html">typedef 声明</a>,且每个声明符引入一个新的类型名,而非对象或函数。</li>
|
|
<li>函数说明符(<a href="cpp-language-inline.html"><code>inline</code></a>、<a href="cpp-language-virtual.html"><code>virtual</code></a>、<a href="cpp-language-explicit.html"><code>explicit</code></a>),仅在<a href="cpp-language-function.html">函数声明</a>中可以使用。</li>
|
|
</ul>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx17">
|
|
<td>
|
|
<ul>
|
|
<li><a href="cpp-language-inline.html"><code>inline</code></a> 说明符也可以用于变量声明。</li>
|
|
</ul>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<ul>
|
|
<li><a href="cpp-language-friend.html"><code>friend</code></a> 说明符,可以在类和函数声明中使用。</li>
|
|
</ul>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<ul>
|
|
<li><a href="cpp-language-constexpr.html"><code>constexpr</code></a> 说明符,只允许在变量定义,函数及函数模板声明,以及具有字面类型的静态数据成员的声明中使用。</li>
|
|
</ul>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx20">
|
|
<td>
|
|
<ul>
|
|
<li><a href="cpp-language-consteval.html"><code>consteval</code></a> 说明符,只允许在函数和函数模板声明中使用。</li>
|
|
<li><a href="cpp-language-constinit.html"><code>constinit</code></a> 说明符,只允许在拥有静态或线程存储期的变量声明中使用。<code>constexpr</code> 、 <code>consteval</code> 和 <code>constinit</code> 说明符在一个 <span class="t-spar">声明说明符序列</span> 中最多只能出现一个。</li>
|
|
</ul>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<ul>
|
|
<li><a href="cpp-language-storage_duration.html">存储类说明符</a>(<span class="t-rev-inl t-until-cxx17"><span><a href="cpp-keyword-register.html"><tt>register</tt></a>、</span> <span><span class="t-mark-rev t-until-cxx17">(C++17 前)</span></span></span> <a href="cpp-keyword-static.html"><tt>static</tt></a><span class="t-rev-inl t-since-cxx11"><span>、<a href="cpp-keyword-thread_local.html"><tt>thread_local</tt></a></span> <span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></span></span>、<a href="cpp-keyword-extern.html"><tt>extern</tt></a>、<a href="cpp-keyword-mutable.html"><tt>mutable</tt></a>)。只能使用一个存储类说明符,但 <code>thread_local</code> 可以与 <code>extern</code> 或 <code>static</code> 一同出现。</li>
|
|
<li><b>类型说明符</b>(<span class="t-spar">类型说明符序列</span>),指名一个类型的说明符的序列。声明所引入的每个实体均为此类型,并可以被声明符修饰(见下文)。这个说明符序列也用于<a href="cpp-language-type.html#.E7.B1.BB.E5.9E.8B.E7.9A.84.E5.91.BD.E5.90.8D">类型标识(type-id)</a>。只有下列说明符是 <span class="t-spar">类型说明符序列</span> 的一部分,顺序不限:</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><a href="cpp-language-class.html">类说明符</a></li>
|
|
<li><a href="cpp-language-enum.html">枚举说明符</a></li>
|
|
<li>简单类型说明符</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><a href="cpp-keyword-char.html"><tt>char</tt></a><span class="t-rev-inl t-since-cxx20"><span>、<a href="cpp-keyword-char8_t.html"><tt>char8_t</tt></a></span> <span><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></span></span><span class="t-rev-inl t-since-cxx11"><span>、<a href="cpp-keyword-char16_t.html"><tt>char16_t</tt></a>、<a href="cpp-keyword-char32_t.html"><tt>char32_t</tt></a></span> <span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></span></span>、<a href="cpp-keyword-wchar_t.html"><tt>wchar_t</tt></a>、<a href="cpp-keyword-bool.html"><tt>bool</tt></a>、<a href="cpp-keyword-short.html"><tt>short</tt></a>、<a href="cpp-keyword-int.html"><tt>int</tt></a>、<a href="cpp-keyword-long.html"><tt>long</tt></a>、<a href="cpp-keyword-signed.html"><tt>signed</tt></a>、<a href="cpp-keyword-unsigned.html"><tt>unsigned</tt></a>、<a href="cpp-keyword-float.html"><tt>float</tt></a>、<a href="cpp-keyword-double.html"><tt>double</tt></a>、<a href="cpp-keyword-void.html"><tt>void</tt></a></li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<dl>
|
|
<dd>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><a href="cpp-language-auto.html">auto</a></li>
|
|
<li><a href="cpp-language-decltype.html">decltype 说明符</a></li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<dl>
|
|
<dd>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>先前声明过的类名(可<a href="cpp-language-identifiers.html#.E6.9C.89.E9.99.90.E5.AE.9A.E7.9A.84.E6.A0.87.E8.AF.86.E7.AC.A6">限定</a>)</li>
|
|
<li>先前声明过的枚举名(可<a href="cpp-language-identifiers.html#.E6.9C.89.E9.99.90.E5.AE.9A.E7.9A.84.E6.A0.87.E8.AF.86.E7.AC.A6">限定</a>)</li>
|
|
<li>先前声明过的 <a href="cpp-language-typedef.html">typedef 名</a><span class="t-rev-inl t-since-cxx11"><span>或<a href="cpp-language-type_alias.html">类型别名</a></span> <span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></span></span>(可<a href="cpp-language-identifiers.html#.E6.9C.89.E9.99.90.E5.AE.9A.E7.9A.84.E6.A0.87.E8.AF.86.E7.AC.A6">限定</a>)</li>
|
|
<li>带模板实参的模板名(可<a href="cpp-language-identifiers.html#.E6.9C.89.E9.99.90.E5.AE.9A.E7.9A.84.E6.A0.87.E8.AF.86.E7.AC.A6">限定</a>,可使用 <a href="cpp-language-dependent_name.html">template 消歧义符</a>)</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx17">
|
|
<td>
|
|
<dl>
|
|
<dd>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>无模板实参的模板名(可<a href="cpp-language-identifiers.html#.E6.9C.89.E9.99.90.E5.AE.9A.E7.9A.84.E6.A0.87.E8.AF.86.E7.AC.A6">限定</a>):参阅<a href="cpp-language-class_template_argument_deduction.html">类模板实参推导</a></li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
</dd>
|
|
</dl>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li><a href="cpp-language-elaborated_type_specifier.html">详述类型说明符</a></li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>关键词 <a href="cpp-keyword-class.html"><tt>class</tt></a>、<a href="cpp-keyword-struct.html"><tt>struct</tt></a> 或 <a href="cpp-keyword-union.html"><tt>union</tt></a>,后随先前已定义为 <code>class</code>、<code>struct</code> 或 <code>union</code> 名的标识符(可<a href="cpp-language-identifiers.html#.E6.9C.89.E9.99.90.E5.AE.9A.E7.9A.84.E6.A0.87.E8.AF.86.E7.AC.A6">限定</a>)。</li>
|
|
<li>关键词 <a href="cpp-keyword-class.html"><tt>class</tt></a>、<a href="cpp-keyword-struct.html"><tt>struct</tt></a> 或 <a href="cpp-keyword-union.html"><tt>union</tt></a>,后随带模板实参的、先前已定义为类模板名字的模板名(可<a href="cpp-language-identifiers.html#.E6.9C.89.E9.99.90.E5.AE.9A.E7.9A.84.E6.A0.87.E8.AF.86.E7.AC.A6">限定</a>,可使用 <a href="cpp-language-dependent_name.html">template 消歧义符</a>)。</li>
|
|
<li>关键词 <a href="cpp-keyword-enum.html"><tt>enum</tt></a> 后随先前已定义为枚举名的标识符(可<a href="cpp-language-identifiers.html#.E6.9C.89.E9.99.90.E5.AE.9A.E7.9A.84.E6.A0.87.E8.AF.86.E7.AC.A6">限定</a>)。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<ul>
|
|
<li><a href="cpp-language-dependent_name.html">typename 说明符</a></li>
|
|
<li><a href="cpp-language-cv.html">cv 限定符</a></li>
|
|
</ul>
|
|
</dd>
|
|
<dd>每个 <span class="t-spar">声明说明符序列</span> 中只允许一个类型说明符,但有以下例外:</dd>
|
|
<dd>- <code>const</code> 能与自身外的任何类型说明符组合。</dd>
|
|
<dd>- <code>volatile</code> 能与自身外的任何类型说明符组合。</dd>
|
|
<dd>- <code>signed</code> 或 <code>unsigned</code> 能与 <code>char</code>、<code>long</code>、<code>short</code> 或 <code>int</code> 组合。</dd>
|
|
<dd>- <code>short</code> 或 <code>long</code> 能与 <code>int</code> 组合。</dd>
|
|
<dd>- <code>long</code> 能与 <code>double</code> 组合。</dd>
|
|
</dl>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<dl>
|
|
<dd>- <code>long</code> 能与 <code>long</code> 组合。</dd>
|
|
</dl>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p><a href="cpp-language-attributes.html">属性</a>可以在 <span class="t-spar">声明说明符序列</span> 中出现,此时它们应用于其之前的说明符所确定的类型。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx17">
|
|
<td>
|
|
<p><span class="t-spar">声明说明符序列</span> 中仅有的允许两次出现的说明符是 <code>long</code>(可出现两次)。所有其他重复,例如 <code>const static const</code> 或 <code>virtual inline virtual</code> 均错。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.A3.B0.E6.98.8E.E7.AC.A6">声明符</span></h3>
|
|
<p><span class="t-spar">初始化声明符列表</span> 是一或多个 <span class="t-spar">初始化声明符</span> 的逗号分隔列表,它拥有下列语法:</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">声明符</span> <span class="t-spar">初始化器</span><span class="t-mark">(可选)</span></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">声明符</span> <span class="t-spar">requires-子句</span></td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">声明符</span></td>
|
|
<td>-</td>
|
|
<td>声明符</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">初始化器</span></td>
|
|
<td>-</td>
|
|
<td>可选的初始化器(除非在必要的场合,例如初始化引用或 const 对象时)。细节见<a href="cpp-language-initialization.html">初始化</a>。</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td><span class="t-spar">requires-子句</span></td>
|
|
<td>-</td>
|
|
<td><a href="cpp-language-constraints.html#requires_.E5.AD.90.E5.8F.A5">requires 子句</a>,向<a href="cpp-language-function.html">函数声明</a>添加<a href="cpp-language-constraints.html">制约</a></td>
|
|
</tr>
|
|
</table>
|
|
<p>初始化声明符序列 <span class="t-c"><span class="mw-geshi cpp source-cpp">S D1, D2, D3<span class="sy4">;</span></span></span> 中的每个 <span class="t-spar">初始化声明符</span>,均按照如同它是拥有相同说明符的孤立声明来处理:<span class="t-c"><span class="mw-geshi cpp source-cpp">S D1<span class="sy4">;</span> S D2<span class="sy4">;</span> S D3<span class="sy4">;</span></span></span>。</p>
|
|
<p>每个声明符恰好引入一个对象、引用、函数或(对于 typedef 声明)类型别名,其类型由 <span class="t-spar">声明说明符序列</span> 提供,并可选地被声明符中的运算符,如 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">&</span></span></span>(~的引用)或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">[</span><span class="br0">]</span></span></span>(~的数组)或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span><span class="br0">)</span></span></span>(返回~的函数)所修饰。可以递归应用这些声明符,如下所示。</p>
|
|
<p><span class="t-spar">声明符</span> 是下列之一:</p>
|
|
<table class="t-sdsc-begin">
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">无限定标识</span> <span class="t-spar">属性</span><span class="t-mark">(可选)</span></td>
|
|
<td>(1)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">有限定标识</span> <span class="t-spar">属性</span><span class="t-mark">(可选)</span></td>
|
|
<td>(2)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>...</b></code> <span class="t-spar">标识符</span> <span class="t-spar">属性</span><span class="t-mark">(可选)</span></td>
|
|
<td>(3)</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>*</b></code> <span class="t-spar">属性</span><span class="t-mark">(可选)</span> <span class="t-spar">限定符</span><span class="t-mark">(可选)</span> <span class="t-spar">声明符</span></td>
|
|
<td>(4)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">嵌套名说明符</span> <code><b>*</b></code> <span class="t-spar">属性</span><span class="t-mark">(可选)</span> <span class="t-spar">限定符</span><span class="t-mark">(可选)</span> <span class="t-spar">声明符</span></td>
|
|
<td>(5)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>&</b></code> <span class="t-spar">属性</span><span class="t-mark">(可选)</span> <span class="t-spar">声明符</span></td>
|
|
<td>(6)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><code><b>&&</b></code> <span class="t-spar">属性</span><span class="t-mark">(可选)</span> <span class="t-spar">声明符</span></td>
|
|
<td>(7)</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">非指针声明符</span> <code><b>[</b></code> <span class="t-spar">常量表达式</span><span class="t-mark">(可选)</span> <code><b>]</b></code> <span class="t-spar">属性</span><span class="t-mark">(可选)</span></td>
|
|
<td>(8)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
<tr class="t-sdsc">
|
|
<td><span class="t-spar">非指针声明符</span> <code><b>(</b></code> <span class="t-spar">形参列表</span> <code><b>)</b></code> <span class="t-spar">cv限定符</span><span class="t-mark">(可选)</span> <span class="t-spar">引用限定符</span><span class="t-mark">(可选)</span> <span class="t-spar">异常说明</span><span class="t-mark">(可选)</span> <span class="t-spar">属性</span><span class="t-mark">(可选)</span></td>
|
|
<td>(9)</td>
|
|
<td class="t-sdsc-nopad"></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="10" class="t-sdsc-sep"></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 所声明的<a href="cpp-language-identifiers.html#.E5.90.8D.E5.AD.97">名称</a>。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 使用<a href="cpp-language-identifiers.html#.E6.9C.89.E9.99.90.E5.AE.9A.E7.9A.84.E6.A0.87.E8.AF.86.E7.AC.A6">有限定的标识符</a>(<span class="t-spar">有限定标识</span>)定义或重声明先前声明的<a href="cpp-language-namespace.html#.E5.91.BD.E5.90.8D.E7.A9.BA.E9.97.B4">命名空间成员</a>或<a href="cpp-language-classes.html">类成员</a>的声明符。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> <a href="cpp-language-parameter_pack.html">形参包</a>,只会在<a href="cpp-language-function.html#.E5.BD.A2.E5.8F.82.E5.88.97.E8.A1.A8">形参声明</a>中出现。</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> <a href="cpp-language-pointer.html">指针声明符</a>:声明 <span class="t-c"><span class="mw-geshi cpp source-cpp">S <span class="sy2">*</span> D<span class="sy4">;</span></span></span> 将 <code>D</code> 声明为指向 <span class="t-spar">声明说明符序列</span> 所确定的类型 <code>S</code> 的指针。</div>
|
|
<div class="t-li1"><span class="t-li">5)</span> <a href="cpp-language-pointer.html">成员指针声明</a>:声明 <span class="t-c"><span class="mw-geshi cpp source-cpp">S C<span class="sy4">::</span><span class="sy2">*</span> D<span class="sy4">;</span></span></span> 将 <code>D</code> 声明为指向 <code>C</code> 中的类型是 <span class="t-spar">声明说明符序列</span> 所确定的类型 <code>S</code> 的成员的指针。<span class="t-spar">嵌套名说明符</span> 是<a href="cpp-language-identifiers.html#.E6.9C.89.E9.99.90.E5.AE.9A.E7.9A.84.E6.A0.87.E8.AF.86.E7.AC.A6">名字和作用域解析运算符 <code><b>::</b></code> 的序列</a></div>
|
|
<div class="t-li1"><span class="t-li">6)</span> <a href="cpp-language-reference.html">左值引用声明符</a>:声明 <span class="t-c"><span class="mw-geshi cpp source-cpp">S <span class="sy3">&</span> D<span class="sy4">;</span></span></span> 将 <code>D</code> 声明为到 <span class="t-spar">声明说明符序列</span> 所确定的类型 <code>S</code> 的左值引用。</div>
|
|
<div class="t-li1"><span class="t-li">7)</span> <a href="cpp-language-reference.html">右值引用声明符</a>:声明 <span class="t-c"><span class="mw-geshi cpp source-cpp">S <span class="sy3">&&</span> D<span class="sy4">;</span></span></span> 将 <code>D</code> 声明为到 <span class="t-spar">声明说明符序列</span> 所确定的类型 <code>S</code> 的右值引用。</div>
|
|
<div class="t-li1"><span class="t-li">8)</span> <a href="cpp-language-array.html">数组声明符</a>。<span class="t-spar">非指针声明符</span> 为任何合法声明符,但如果它以 *、& 或 && 起始,则必须用括号环绕它。</div>
|
|
<div class="t-li1"><span class="t-li">9)</span> <a href="cpp-language-function.html">函数声明符</a>。<span class="t-spar">非指针声明符</span> 为任何合法声明符,但如果它以 *、& 或 && 起始,则必须用括号环绕它。<span class="t-rev-inl t-since-cxx11"><span>注意最外层函数声明符可以可选的尾随返回类型结尾。</span> <span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></span></span></div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<p>所有情况下,<span class="t-spar">属性</span> 均为可选的<a href="cpp-language-attributes.html">属性</a>的序列。当其紧跟标识符之后出现时,它应用于所声明的对象。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p><span class="t-spar">限定符</span> 是 <a href="cpp-language-cv.html">const 与 volatile</a> 限定符的序列,其中任一限定符在序列中至多出现一次。</p>
|
|
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
|
|
<tr>
|
|
<td class="mbox-empty-cell"></td>
|
|
<td class="mbox-text" style="">本节未完成<br />
|
|
原因:解释名字隐藏规则;变量/函数声明如何隐藏同名的类(而非 typedef)</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p><span class="t-spar">块声明</span>出现<a href="cpp-language-statements.html#.E5.A4.8D.E5.90.88.E8.AF.AD.E5.8F.A5">在代码块内</a>,而当声明中引入的标识符之前已在某个外层代码块中声明时,该代码块的剩余部分中<a href="cpp-language-scope.html">外层声明被隐藏</a>。</p>
|
|
<p>如果一个声明引入了一个具有自动存储期的变量,则它在执行其声明语句时被初始化。退出代码块时,所有在该块中声明的自动变量被以其初始化顺序的相反顺序销毁(与如何退出代码块无关:通过<a href="cpp-language-exceptions.html">异常</a>、<a href="cpp-language-goto.html">goto</a> 或抵达其结尾)。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<div class="t-example">
|
|
<div class="t-example-live-link"></div>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw1">class</span> C <span class="br0">{</span>
|
|
<a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a> member<span class="sy4">;</span> <span class="co1">// 声明说明符序列 是 "std::string"</span>
|
|
<span class="co1">// 声明符 是 "member"</span>
|
|
<span class="br0">}</span> obj, <span class="sy2">*</span>pObj<span class="br0">(</span><span class="sy3">&</span>obj<span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="co1">// 声明说明符序列为 "class C { std::string member; }"</span>
|
|
<span class="co1">// 声明符 "obj" 定义 C 类型的对象</span>
|
|
<span class="co1">// 声明符 "*pObj(&obj)" 声明并初始化指向 C 的指针</span>
|
|
|
|
<span class="kw4">int</span> a <span class="sy1">=</span> <span class="nu0">1</span>, <span class="sy2">*</span>p <span class="sy1">=</span> nullptr, f<span class="br0">(</span><span class="br0">)</span>, <span class="br0">(</span><span class="sy2">*</span>pf<span class="br0">)</span><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="co1">// 声明说明符序列为 int</span>
|
|
<span class="co1">// 声明符 a=1 定义并初始化 int 类型的变量</span>
|
|
<span class="co1">// 声明符 *p=nullptr 定义并初始化 int* 类型的变量</span>
|
|
<span class="co1">// 声明符 (f)() 声明(但不定义)不接收参数并返回 int 的函数</span>
|
|
<span class="co1">// 声明符 (*pf)(double) 定义一个指向接收 double 并返回 int 的函数的指针</span>
|
|
|
|
<span class="kw4">int</span> <span class="br0">(</span><span class="sy2">*</span><span class="br0">(</span><span class="sy2">*</span>foo<span class="br0">)</span><span class="br0">(</span><span class="kw4">double</span><span class="br0">)</span><span class="br0">)</span><span class="br0">[</span><span class="nu0">3</span><span class="br0">]</span> <span class="sy1">=</span> nullptr<span class="sy4">;</span>
|
|
<span class="co1">// 声明说明符序列为 int</span>
|
|
<span class="co1">// 1. 声明符 "(*(*foo)(double))[3]" 是数组声明符;</span>
|
|
<span class="co1">// 所声明类型是“含有 3 个 int 元素的数组 /嵌套声明符/ ”</span>
|
|
<span class="co1">// 2. 嵌套声明符是 "(*(*foo)(double))",它是指针声明符</span>
|
|
<span class="co1">// 所声明类型是“指向【含有 3 个 int 元素的数组】的指针 /嵌套声明符/”</span>
|
|
<span class="co1">// 3. 嵌套声明符是 "(*foo)(double)",它是函数声明符</span>
|
|
<span class="co1">// 所声明类型是“以【指向含有 3 个 int 元素的数组的指针】</span>
|
|
<span class="co1">// 为返回值的接受一个 double 参数的函数 /嵌套声明符/”</span>
|
|
<span class="co1">// 4. 嵌套声明符是 "(*foo)",它是(带括号,如函数声明符语法所要求的)指针声明符。</span>
|
|
<span class="co1">// 所声明类型是“指向【以指向含有 3 个 int 元素的数组的指针</span>
|
|
<span class="co1">// 为返回值的接受一个 double 参数的函数】的指针 /嵌套声明符/”</span>
|
|
<span class="co1">// 5. 嵌套声明符是 "foo",它是标识符。</span>
|
|
<span class="co1">// 该声明声明了对象 foo,它的类型是“指向以指向含有 3 个 int 元素的数组的指针</span>
|
|
<span class="co1">// 为返回值的接受一个 double 参数的函数的指针”</span>
|
|
<span class="co1">// 初始化器 "= nullptr" 提供此指针的初值。</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin"></table>
|
|
<table>
|
|
<tr>
|
|
<td></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|