1220 lines
120 KiB
HTML
1220 lines
120 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_operator_comparison 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>比较参数。</p>
|
|
<table class="wikitable" style="font-size:85%;">
|
|
<tr>
|
|
<th rowspan="2">运算符名</th>
|
|
<th rowspan="2">语法</th>
|
|
<th rowspan="2"><a href="cpp-language-operators.html">可重载</a></th>
|
|
<th colspan="2">原型示例(对 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">class</span> T</span></span>)</th>
|
|
</tr>
|
|
<tr>
|
|
<th>作为成员函数</th>
|
|
<th>作为自由(命名空间)函数</th>
|
|
</tr>
|
|
<tr>
|
|
<td>等于</td>
|
|
<td><code>a == b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> T<span class="sy4">::</span><span class="me2">operator</span> <span class="sy1">==</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator <span class="sy1">==</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>不等于</td>
|
|
<td><code>a != b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> T<span class="sy4">::</span><span class="me2">operator</span> <span class="sy3">!</span><span class="sy1">=</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator <span class="sy3">!</span><span class="sy1">=</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>小于</td>
|
|
<td><code>a < b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> T<span class="sy4">::</span><span class="me2">operator</span> <span class="sy1"><</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator <span class="sy1"><</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>大于</td>
|
|
<td><code>a > b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> T<span class="sy4">::</span><span class="me2">operator</span> <span class="sy1">></span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator <span class="sy1">></span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>小于或等于</td>
|
|
<td><code>a <= b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> T<span class="sy4">::</span><span class="me2">operator</span> <span class="sy1"><=</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator <span class="sy1"><=</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>大于或等于</td>
|
|
<td><code>a >= b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> T<span class="sy4">::</span><span class="me2">operator</span> <span class="sy1">>=</span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator <span class="sy1">>=</span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>三路比较<span class="t-mark-rev t-since-cxx20">(C++20)</span></td>
|
|
<td><code>a <=> b</code></td>
|
|
<td style="background: #90ff90; color: black; vertical-align: middle; text-align: center;" class="table-yes">是</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="coMULTI">/*见说明*/</span> T<span class="sy4">::</span><span class="me2">operator</span> <span class="sy1"><=></span><span class="br0">(</span><span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span> <span class="kw4">const</span><span class="sy4">;</span></span></span></td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="coMULTI">/*见说明*/</span> operator <span class="sy1"><=></span><span class="br0">(</span><span class="kw4">const</span> T <span class="sy3">&</span>a, <span class="kw4">const</span> T2 <span class="sy3">&</span>b<span class="br0">)</span><span class="sy4">;</span></span></span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<dl>
|
|
<dd><b>注解</b><br /></dd>
|
|
</dl>
|
|
<ul>
|
|
<li>内建运算符返回 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span>,所以大多数<a href="cpp-language-operators.html">用户定义重载</a>也返回 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span>以使用户定义运算符能以与内建运算符相同的方式使用。然而,在用户定义运算符重载中,任何类型都可用作返回类型(包含 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span>)。</li>
|
|
<li><code>T2</code> 可以是包括 <code>T</code> 在内的任何类型</li>
|
|
</ul>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.8C.E8.B7.AF.E6.AF.94.E8.BE.83">双路比较</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> <code><b><</b></code> <span class="t-spar">右操作数</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> <code><b>></b></code> <span class="t-spar">右操作数</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><span class="t-spar">左操作数</span> <code><b><=</b></code> <span class="t-spar">右操作数</span></td>
|
|
<td>(3)</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></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></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><span class="t-spar">左操作数</span> <code><b>!=</b></code> <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>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">1)</span> 若 <span class="t-spar">左操作数</span> 小于 <span class="t-spar">右操作数</span> 则返回 <code>true</code>,否则返回 <code>false</code>。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 若 <span class="t-spar">左操作数</span> 大于 <span class="t-spar">右操作数</span> 则返回 <code>true</code>,否则返回 <code>false</code>。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 若 <span class="t-spar">左操作数</span> 小于或等于 <span class="t-spar">右操作数</span> 则返回 <code>true</code>,否则返回 <code>false</code>。</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 若 <span class="t-spar">左操作数</span> 大于或等于 <span class="t-spar">右操作数</span> 则返回 <code>true</code>,否则返回 <code>false</code>。</div>
|
|
<div class="t-li1"><span class="t-li">5)</span> 若 <span class="t-spar">左操作数</span> 等于 <span class="t-spar">右操作数</span> 则返回 <code>true</code>,否则返回 <code>false</code>。</div>
|
|
<div class="t-li1"><span class="t-li">6)</span> 若 <span class="t-spar">左操作数</span> 不等于 <span class="t-spar">右操作数</span> 则返回 <code>true</code>,否则返回 <code>false</code>。</div>
|
|
<p>所有情况下,对于内建运算符,<span class="t-spar">左操作数</span> 和 <span class="t-spar">右操作数</span> 在应用<a href="cpp-language-implicit_conversion.html#.E5.B7.A6.E5.80.BC.E5.88.B0.E5.8F.B3.E5.80.BC.E8.BD.AC.E6.8D.A2">左值到右值</a>、<a href="cpp-language-implicit_conversion.html#.E6.95.B0.E7.BB.84.E5.88.B0.E6.8C.87.E9.92.88.E8.BD.AC.E6.8D.A2">数组到指针</a>和<a href="cpp-language-implicit_conversion.html#.E5.87.BD.E6.95.B0.E5.88.B0.E6.8C.87.E9.92.88.E8.BD.AC.E6.8D.A2">函数到指针</a>标准转换后,必须具有下列类型之一</p>
|
|
<ul>
|
|
<li>算术或枚举类型(见下文的算术比较运算符)</li>
|
|
<li>指针类型(见下文的指针比较运算符)</li>
|
|
</ul>
|
|
<p><span class="t-rev-inl t-since-cxx20"><span>若两个运算数在应用这些转换前均具有数组类型,则这种比较被弃用。</span> <span><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></span></span></p>
|
|
<p>任何情况下,结果均为 <code>bool</code> 纯右值。</p>
|
|
<h5><span class="mw-headline" id=".E7.AE.97.E6.9C.AF.E6.AF.94.E8.BE.83.E8.BF.90.E7.AE.97.E7.AC.A6">算术比较运算符</span></h5>
|
|
<p>如果两个操作数具有算术或(有作用域或无作用域)枚举类型,则遵循<a href="cpp-language-operator_arithmetic.html">算术运算符</a>的规则,对两个操作数实施<i>一般算术转换</i>。转换之后进行值的比较:</p>
|
|
<h5><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h5>
|
|
<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="co2">#include <iostream></span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<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-boolalpha.html"><span class="kw1764">std::<span class="me2">boolalpha</span></span></a><span class="sy4">;</span>
|
|
<span class="kw4">int</span> n <span class="sy1">=</span> <span class="sy2">-</span><span class="nu0">1</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">int</span> n2 <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">" -1 == 1? "</span> <span class="sy1"><<</span> <span class="br0">(</span>n <span class="sy1">==</span> n2<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">"比较两个有符号值:<span class="es1">\n</span>"</span>
|
|
<span class="sy1"><<</span> <span class="st0">" -1 < 1? "</span> <span class="sy1"><<</span> <span class="br0">(</span>n <span class="sy1"><</span> n2<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">" -1 > 1? "</span> <span class="sy1"><<</span> <span class="br0">(</span>n <span class="sy1">></span> n2<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">unsigned</span> <span class="kw4">int</span> u <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"比较有符号与无符号值:<span class="es1">\n</span>"</span>
|
|
<span class="sy1"><<</span> <span class="st0">" -1 < 1? "</span> <span class="sy1"><<</span> <span class="br0">(</span>n <span class="sy1"><</span> u<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">" -1 > 1? "</span> <span class="sy1"><<</span> <span class="br0">(</span>n <span class="sy1">></span> u<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
static_assert<span class="br0">(</span>sizeof<span class="br0">(</span><span class="kw4">unsigned</span> <span class="kw4">char</span><span class="br0">)</span> <span class="sy1"><</span> sizeof<span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span>,
|
|
<span class="st0">"不能正确地比较有符号值与较小的无符号值"</span><span class="br0">)</span><span class="sy4">;</span>
|
|
<span class="kw4">unsigned</span> <span class="kw4">char</span> uc <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"比较无符号值和较小的有符号值:<span class="es1">\n</span>"</span>
|
|
<span class="sy1"><<</span> <span class="st0">" -1 < 1? "</span> <span class="sy1"><<</span> <span class="br0">(</span>n <span class="sy1"><</span> uc<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span>
|
|
<span class="sy1"><<</span> <span class="st0">" -1 > 1? "</span> <span class="sy1"><<</span> <span class="br0">(</span>n <span class="sy1">></span> uc<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">
|
|
-1 == 1? false
|
|
比较两个有符号值:
|
|
-1 < 1? true
|
|
-1 > 1? false
|
|
比较有符号与无符号值:
|
|
-1 < 1? false
|
|
-1 > 1? true
|
|
比较无符号值和较小的有符号值:
|
|
-1 < 1? true
|
|
-1 > 1? false</pre></div>
|
|
</div>
|
|
</div>
|
|
<h4><span class="mw-headline" id=".E6.8C.87.E9.92.88.E6.AF.94.E8.BE.83.E8.BF.90.E7.AE.97.E7.AC.A6">指针比较运算符</span></h4>
|
|
<p>比较运算符能用于比较二个指针。</p>
|
|
<p>只有相等性运算符(<span class="t-c"><span class="mw-geshi cpp source-cpp">operator<span class="sy1">==</span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp">operator<span class="sy3">!</span><span class="sy1">=</span></span></span>)能用于比较下列指针对:</p>
|
|
<ul>
|
|
<li>两个成员指针</li>
|
|
<li>一个空指针常量与一个指针或成员指针</li>
|
|
</ul>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<ul>
|
|
<li>一个 <span class="t-lc"><a href="cpp-types-nullptr_t.html">std::nullptr_t</a></span> 值与一个空指针常量(也可以是 <span class="t-lc"><a href="cpp-types-nullptr_t.html">std::nullptr_t</a></span> 值)</li>
|
|
</ul>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>首先,对两个操作数应用<a href="cpp-language-implicit_conversion.html">指针转换</a>(若参数为成员指针则为成员指针转换)<span class="t-rev-inl t-since-cxx17"><span>、函数指针转换</span> <span><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></span></span>和<a href="cpp-language-implicit_conversion.html">限定性转换</a>,以获得<i>合成指针类型</i>,规则如下:</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx11">
|
|
<td>
|
|
<div class="t-li1"><span class="t-li">1)</span> 若两个操作数均为空指针常量,则合成指针类型为 <span class="t-lc"><a href="cpp-types-nullptr_t.html">std::nullptr_t</a></span></div>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-li1"><span class="t-li">2)</span> 若一个操作数为空指针常量,而另一个为指针,则合成类型正是该指针类型</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 若两个操作数分别为
|
|
<ul>
|
|
<li>指向 <i>cv1</i> <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span> 的指针,和</li>
|
|
<li>指向 <i>cv2</i> <code>T</code> 的指针,其中 <code>T</code> 为对象类型或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span>,</li>
|
|
</ul>
|
|
则合成类型为“指向 <i>cv12</i> <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span> 的指针”,其中 <i>cv12</i> 为 <i>cv1</i> 与 <i>cv2</i> 的合并</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 若两个操作数的类型分别为
|
|
<ul>
|
|
<li>指向(可能 cv 限定的)<code>T1</code> 的指针 <code>P1</code>,和</li>
|
|
<li>指向(可能 cv 限定的)<code>T2</code> 的指针 <code>P2</code>,</li>
|
|
</ul>
|
|
且如果 <code>T1</code> 与 <code>T2</code> 相同或是 <code>T2</code> 的基类,则合成指针类型为 <code>P1</code> 与 <code>P2</code> 的 <i>cv 结合</i>类型。否则,如果 <code>T2</code> 为 <code>T1</code> 的基类,则合成指针类型为 <code>P2</code> 与 <code>P1</code> 的 <i>cv 结合</i>类型。</div>
|
|
<div class="t-li1"><span class="t-li">5)</span> 若两个操作数的类型分别为
|
|
<ul>
|
|
<li>指向 <code>T1</code> 的成员,其类型为(可能 cv 限定的)<code>U1</code>,的指针 <code>MP1</code>,和</li>
|
|
<li>指向 T2 的成员,其类型为(可能 cv 限定的)<code>U2</code>,的指针 <code>MP2</code>,</li>
|
|
</ul>
|
|
且如果 <code>T1</code> 与 <code>T2</code> 相同或派生自 <code>T2</code>,则合成指针类型为 <code>MP1</code> 和 <code>MP2</code> 的 <i>cv 结合</i>类型。否则,如果 <code>T2</code> 派生自 <code>T1</code>,则合成指针类型为 <code>MP2</code> 与 <code>MP1</code> 的 <i>cv 结合</i>类型。</div>
|
|
<div class="t-li1"><span class="t-li">6)</span> 若操作数 <code>P1</code> 和 <code>P2</code> 的类型具有相同层数的多层混合指针和成员指针类型,而仅在任意层上的 cv 限定性有别,则合成指针类型为 <code>P1</code> 与 <code>P2</code> 的 <i>cv 结合</i>类型</div>
|
|
<p>在上面的定义中,两个指针类型 <code>P1</code> 和 <code>P2</code> 的 <i>cv 结合</i>类型,是与 <code>P1</code> 拥有相同的层数且每层具有与 <code>P1</code> 相同类型的类型 <code>P3</code>,其中每层上的 cv 限定性设定如下:</p>
|
|
<div class="t-li1"><span class="t-li">a)</span> 除顶层之外的每层,其 cv 限定性为该层上 <code>P1</code> 与 <code>P2</code> 的 cv 限定性的合并</div>
|
|
<div class="t-li1"><span class="t-li">b)</span> 如果有任何层上得到的 cv 限定性与同一层上 <code>P1</code> 或 <code>P2</code> 的 cv 限定性不同,则对顶层和此层之间的每一层添加 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">const</span></span></span>。</div>
|
|
<p>例如,<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">const</span> <span class="kw4">int</span><span class="sy2">*</span></span></span> 的合成指针类型为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">const</span> <span class="kw4">void</span><span class="sy2">*</span></span></span>。<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span><span class="sy2">**</span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">const</span> <span class="kw4">int</span><span class="sy2">**</span></span></span> 的合成指针类型为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">const</span> <span class="kw4">int</span><span class="sy2">*</span> <span class="kw4">const</span><span class="sy2">*</span></span></span>。注意,在 <a rel="nofollow" class="external text" href="https://wg21.link/n3624">CWG1512 的解决方案</a>之前无法比较 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span><span class="sy2">**</span></span></span> 和 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">const</span> <span class="kw4">int</span><span class="sy2">**</span></span></span>。</p>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx17">
|
|
<td>
|
|
<p>除上述之外,函数指针和指向 noexcept 函数的指针(只要函数类型相同)的合成指针类型为函数指针。</p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>注意这意味着任何指针都能与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span><span class="sy2">*</span></span></span> 进行比较。</p>
|
|
<p>两个(转换后的)对象指针的比较结果定义如下:</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> 若两个指针指向同一数组的不同元素,或同一数组的不同元素内的子对象,则指向拥有较高下标的元素的指针<i>比较大于</i>另一指针。换言之,比较指针的结果与比较其所指向的元素下标结果相同。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 若一个指针指向数组元素,或数组元素的子对象,而另一指针指向数组末尾元素后一位置,则后者<i>比较大于</i>前者。指向单个对象的指针被当做指向单元素数组的指针:<code>&obj+1</code> 比较大于 <code>&obj</code>。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 若在非联合体类类型的对象内,两个指针指向<span class="t-rev-inl t-until-cxx23"><span>拥有相同<a href="cpp-language-access.html">成员访问</a>的</span> <span><span class="t-mark-rev t-until-cxx23">(C++23 前)</span></span></span><span class="t-rev-inl t-since-cxx20"><span><a href="cpp-language-attributes-no_unique_address.html">非零大小</a>的</span> <span><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></span></span>不同非静态数据成员,或(递归地)指向这种成员的子对象或数组元素,则指向较后声明的成员的指针<i>比较大于</i>另一指针。换言之,三个成员访问模式的每一者中的类成员按声明顺序置于内存中。</div>
|
|
<p>两个(转换后的)指针的相等性比较的结果定义如下:</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> 若两个指针均为空指针值,则它们<i>比较相等</i></div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 若两个指针均为函数指针且指向同一函数,则它们<i>比较相等</i></div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 若两个指针均为对象指针且表示相同地址,则它们<i>比较相等</i>(这包括两个指向同一联合体的不同非静态成员的指针,指向标准布局结构体与其首成员的指针,由 <a href="cpp-language-reinterpret_cast.html"><code>reinterpret_cast</code></a> 关联的指针等)</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 所有其他指针的比较不相等。</div>
|
|
<p>两个(转换后的)成员指针的比较结果定义如下:</p>
|
|
<div class="t-li1"><span class="t-li">1)</span> 若两个成员指针均为空成员指针值,则它们<i>比较相等</i>。</div>
|
|
<div class="t-li1"><span class="t-li">2)</span> 否则,若两个成员指针之一为空成员指针值,则它们比较不相等。</div>
|
|
<div class="t-li1"><span class="t-li">3)</span> 否则,若其中之一为指向虚成员函数的指针,则结果未指明。</div>
|
|
<div class="t-li1"><span class="t-li">4)</span> 否则,当且仅当以一个其关联类类型的假想对象对它们解引用时,它们会指代同一最终派生对象或同一子对象的相同成员,两个成员指针相等。</div>
|
|
<div class="t-li1"><span class="t-li">5)</span> 否则它们的比较不相等。</div>
|
|
<p><br />
|
|
若指针 <code>p</code> <i>比较等于</i>指针 <code>q</code>,则 <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy1"><=</span>q</span></span> 和 <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy1">>=</span>q</span></span> 都产出 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 而 <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy1"><</span>q</span></span> 和 <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy1">></span>q</span></span> 都产出 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span>。</p>
|
|
<p>若指针 <code>p</code> <i>比较大于</i>指针 <code>q</code>,则 <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy1">>=</span>q</span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy1">></span>q</span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp">q<span class="sy1"><=</span>p</span></span> 和 <span class="t-c"><span class="mw-geshi cpp source-cpp">q<span class="sy1"><</span>p</span></span> 都产出 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 而 <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy1"><=</span>q</span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy1"><</span>q</span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp">q<span class="sy1">>=</span>p</span></span> 和 <span class="t-c"><span class="mw-geshi cpp source-cpp">q<span class="sy1">></span>p</span></span> 都产出 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span>。</p>
|
|
<p>若未指明两个指针的比较大于或比较相等,则其比较结果未指明。其结果可以是不确定的,并且甚至不必在程序的同一次执行中,在拥有相同操作数的相同表达式的多次求值之间保持一致:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw4">int</span> x, y<span class="sy4">;</span>
|
|
|
|
<span class="kw4">bool</span> f<span class="br0">(</span><span class="kw4">int</span><span class="sy2">*</span> p, <span class="kw4">int</span><span class="sy2">*</span> q<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">return</span> p <span class="sy1"><</span> q<span class="sy4">;</span> <span class="br0">}</span>
|
|
|
|
<a href="cpp-error-assert.html"><span class="kw774">assert</span></a><span class="br0">(</span>f<span class="br0">(</span><span class="sy3">&</span>x, <span class="sy3">&</span>y<span class="br0">)</span> <span class="sy1">==</span> f<span class="br0">(</span><span class="sy3">&</span>x, <span class="sy3">&</span>y<span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 在遵从标准的实现中可能引发断言</span></pre></div>
|
|
</div>
|
|
<p>在<a href="cpp-language-overload_resolution.html#.E8.B0.83.E7.94.A8.E9.87.8D.E8.BD.BD.E8.BF.90.E7.AE.97.E7.AC.A6">针对用户定义运算符的重载决议</a>中,对于(包括枚举类型的)每个提升后算术类型 <code>L</code> 和 <code>R</code>,下列函数签名参与重载决议:</p>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy1"><</span><span class="br0">(</span>L, R<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy1">></span><span class="br0">(</span>L, R<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy1"><=</span><span class="br0">(</span>L, R<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy1">>=</span><span class="br0">(</span>L, R<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy1">==</span><span class="br0">(</span>L, R<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy3">!</span><span class="sy1">=</span><span class="br0">(</span>L, R<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>对于每个对象指针或函数指针的类型 <code>P</code>,下列函数签名参与重载决议:</p>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy1"><</span><span class="br0">(</span>P, P<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy1">></span><span class="br0">(</span>P, P<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy1"><=</span><span class="br0">(</span>P, P<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy1">>=</span><span class="br0">(</span>P, P<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy1">==</span><span class="br0">(</span>P, P<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy3">!</span><span class="sy1">=</span><span class="br0">(</span>P, P<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>对于每个为成员对象指针或成员函数指针或 <span class="t-lc"><a href="cpp-types-nullptr_t.html">std::nullptr_t</a></span> 的类型 <code>MP</code>,下列函数签名参与重载决议:</p>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy1">==</span><span class="br0">(</span>MP, MP<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="sy3">!</span><span class="sy1">=</span><span class="br0">(</span>MP, MP<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<h5><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B_2">示例</span></h5>
|
|
<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="co2">#include <iostream></span>
|
|
<span class="kw1">struct</span> Foo <span class="br0">{</span> <span class="kw4">int</span> n1<span class="sy4">;</span> <span class="kw4">int</span> n2<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw1">union</span> Union <span class="br0">{</span> <span class="kw4">int</span> n<span class="sy4">;</span> <span class="kw4">double</span> d<span class="sy4">;</span> <span class="br0">}</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<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-boolalpha.html"><span class="kw1764">std::<span class="me2">boolalpha</span></span></a><span class="sy4">;</span>
|
|
|
|
<span class="kw4">char</span> a<span class="br0">[</span><span class="nu0">4</span><span class="br0">]</span> <span class="sy1">=</span> <span class="st0">"abc"</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">char</span><span class="sy2">*</span> p1 <span class="sy1">=</span> <span class="sy3">&</span>a<span class="br0">[</span><span class="nu0">1</span><span class="br0">]</span><span class="sy4">;</span>
|
|
<span class="kw4">char</span><span class="sy2">*</span> p2 <span class="sy1">=</span> <span class="sy3">&</span>a<span class="br0">[</span><span class="nu0">2</span><span class="br0">]</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"指向数组元素的指针:p1 == p2 "</span> <span class="sy1"><<</span> <span class="br0">(</span>p1 <span class="sy1">==</span> p2<span class="br0">)</span>
|
|
<span class="sy1"><<</span> <span class="st0">", p1 < p2 "</span> <span class="sy1"><<</span> <span class="br0">(</span>p1 <span class="sy1"><</span> p2<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
Foo f<span class="sy4">;</span>
|
|
<span class="kw4">int</span><span class="sy2">*</span> p3 <span class="sy1">=</span> <span class="sy3">&</span>f.<span class="me1">n1</span><span class="sy4">;</span>
|
|
<span class="kw4">int</span><span class="sy2">*</span> p4 <span class="sy1">=</span> <span class="sy3">&</span>f.<span class="me1">n2</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"指向类成员的指针:p3 == p4 "</span> <span class="sy1"><<</span> <span class="br0">(</span>p3 <span class="sy1">==</span> p4<span class="br0">)</span>
|
|
<span class="sy1"><<</span> <span class="st0">", p3 < p4 "</span> <span class="sy1"><<</span> <span class="br0">(</span>p3 <span class="sy1"><</span> p4<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
|
|
Union u<span class="sy4">;</span>
|
|
<span class="kw4">int</span><span class="sy2">*</span> p5 <span class="sy1">=</span> <span class="sy3">&</span>u.<span class="me1">n</span><span class="sy4">;</span>
|
|
<span class="kw4">double</span><span class="sy2">*</span> p6 <span class="sy1">=</span> <span class="sy3">&</span>u.<span class="me1">d</span><span class="sy4">;</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"指向联合体成员的指针:p5 == (void*)p6 "</span> <span class="sy1"><<</span> <span class="br0">(</span>p5 <span class="sy1">==</span> <span class="br0">(</span><span class="kw4">void</span><span class="sy2">*</span><span class="br0">)</span>p6<span class="br0">)</span>
|
|
<span class="sy1"><<</span> <span class="st0">", p5 < p6 "</span> <span class="sy1"><<</span> <span class="br0">(</span>p5 <span class="sy1"><</span> <span class="br0">(</span><span class="kw4">void</span><span class="sy2">*</span><span class="br0">)</span>p6<span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">指向数组元素的指针:p1 == p2 false, p1 < p2 true
|
|
指向类成员的指针:p3 == p4 false, p3 < p4 true
|
|
指向联合体成员的指针:p5 == (void*)p6 true, p5 < p6 false</pre></div>
|
|
</div>
|
|
</div>
|
|
<h4><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h4>
|
|
<p>因为这些运算符从左到右组合,故表达式 <span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="sy1"><</span>b<span class="sy1"><</span>c</span></span> 被分析为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span>a<span class="sy1"><</span>b<span class="br0">)</span><span class="sy1"><</span>c</span></span>,而非 <span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="sy1"><</span><span class="br0">(</span>b<span class="sy1"><</span>c<span class="br0">)</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span>a<span class="sy1"><</span>b<span class="br0">)</span><span class="sy3">&&</span><span class="br0">(</span>b<span class="sy1"><</span>c<span class="br0">)</span></span></span>。</p>
|
|
<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="co2">#include <iostream></span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="kw4">int</span> a <span class="sy1">=</span> <span class="nu0">3</span>, b <span class="sy1">=</span> <span class="nu0">2</span>, c <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<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-boolalpha.html"><span class="kw1764">std::<span class="me2">boolalpha</span></span></a>
|
|
<span class="sy1"><<</span> <span class="br0">(</span> a <span class="sy1"><</span> b <span class="sy1"><</span> c <span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span> <span class="co1">// true ;可能警告</span>
|
|
<span class="sy1"><<</span> <span class="br0">(</span> <span class="br0">(</span> a <span class="sy1"><</span> b <span class="br0">)</span> <span class="sy1"><</span> c <span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span> <span class="co1">// true</span>
|
|
<span class="sy1"><<</span> <span class="br0">(</span> a <span class="sy1"><</span> <span class="br0">(</span> b <span class="sy1"><</span> c <span class="br0">)</span> <span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span> <span class="co1">// false</span>
|
|
<span class="sy1"><<</span> <span class="br0">(</span> <span class="br0">(</span> a <span class="sy1"><</span> b <span class="br0">)</span> <span class="sy3">&&</span> <span class="br0">(</span> b <span class="sy1"><</span> c <span class="br0">)</span> <span class="br0">)</span> <span class="sy1"><<</span> <span class="st0">'<span class="es1">\n</span>'</span><span class="sy4">;</span> <span class="co1">// false</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<p>对<a href="cpp-language-operators.html#.E6.AF.94.E8.BE.83.E8.BF.90.E7.AE.97.E7.AC.A6">用户定义的 operator<</a> 的一项常见要求是<a href="https://en.wikipedia.org/wiki/Strict_weak_ordering" class="extiw" title="enwiki:Strict weak ordering">严格弱序</a>。尤其是,用<a href="cpp-named_req-Compare.html"><span style="font-style:italic">比较</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(Compare)</span></a> 类型进行工作的标准算法和容器如 <span class="t-lc"><a href="cpp-algorithm-sort.html">std::sort</a></span>、<span class="t-lc"><a href="cpp-algorithm-max_element.html">std::max_element</a></span>、<span class="t-lc"><a href="cpp-container-map.html">std::map</a></span> 等都对此有所要求。</p>
|
|
<p>尽管未指明对随机来源(例如不都指向同一数组中的成员)的指针比较的结果,许多实现都提供指针的<a href="https://en.wikipedia.org/wiki/Total_order#Strict_total_order" class="extiw" title="enwiki:Total order">严格全序</a>,例如若它们被实现为连续的虚拟地址空间中的地址。不这样做的实现(例如并非指针的所有位都是内存地址的一部分而在比较中必须被忽略,或要求进行额外的计算否则指针与整数并非一对一关系),为指针提供具有这项保证的 <span class="t-lc"><a href="cpp-utility-functional-less.html">std::less</a></span> 的特化。这使得程序可以将随机来源的所有指针都用作标准关联容器(如 <span class="t-lc"><a href="cpp-container-set.html">std::set</a></span> 或 <span class="t-lc"><a href="cpp-container-map.html">std::map</a></span>)的键。</p>
|
|
<p>对于既为<a href="cpp-named_req-EqualityComparable.html"><span style="font-style:italic">可相等比较</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(EqualityComparable)</span></a> 又为<a href="cpp-named_req-LessThanComparable.html"><span style="font-style:italic">可小于比较</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(LessThanComparable)</span></a> 的类型,C++ 标准库在<i>相等</i>(即表达式 <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">==</span> b</span></span> 的值),和<i>等价</i>(即表达式 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">!</span><span class="br0">(</span>a <span class="sy1"><</span> b<span class="br0">)</span> <span class="sy3">&&</span> <span class="sy3">!</span><span class="br0">(</span>b <span class="sy1"><</span> a<span class="br0">)</span></span></span> 的值)之间做出区别。</p>
|
|
<p><a rel="nofollow" class="external text" href="https://wg21.link/N3624">N3624</a> 中包含的 CWG583 的解决方案移除了指针与空指针常量间的比较。</p>
|
|
<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="kw4">void</span> f<span class="br0">(</span><span class="kw4">char</span> <span class="sy2">*</span> p<span class="br0">)</span>
|
|
<span class="br0">{</span>
|
|
<span class="kw1">if</span> <span class="br0">(</span>p <span class="sy1">></span> <span class="nu0">0</span><span class="br0">)</span> <span class="br0">{</span> <span class="coMULTI">/*...*/</span> <span class="br0">}</span> <span class="co1">// 用 N3624 出错, N3624 前可编译</span>
|
|
<span class="kw1">if</span> <span class="br0">(</span>p <span class="sy1">></span> nullptr<span class="br0">)</span> <span class="br0">{</span> <span class="coMULTI">/*...*/</span> <span class="br0">}</span> <span class="co1">// 用 N3624 出错, N3624 前可编译</span>
|
|
<span class="br0">}</span>
|
|
<span class="kw4">int</span> main<span class="br0">(</span> <span class="br0">)</span><span class="br0">{</span> <span class="br0">}</span></pre></div>
|
|
</div>
|
|
</div>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx20">
|
|
<td>
|
|
<h3><span class="mw-headline" id=".E4.B8.89.E8.B7.AF.E6.AF.94.E8.BE.83">三路比较</span></h3>
|
|
<p>三路比较运算符表达式的形式为</p>
|
|
<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> <code><b><=></b></code> <span class="t-spar">右操作数</span></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>
|
|
<p>表达式返回一个对象,使得</p>
|
|
<ul>
|
|
<li>若 <span class="t-c"><span class="mw-geshi cpp source-cpp">左操作数 <span class="sy1"><</span> 右操作数</span></span> 则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span>a <span class="sy1"><=></span> b<span class="br0">)</span> <span class="sy1"><</span> <span class="nu0">0</span></span></span></li>
|
|
<li>若 <span class="t-c"><span class="mw-geshi cpp source-cpp">左操作数 <span class="sy1">></span> 右操作数</span></span> 则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span>a <span class="sy1"><=></span> b<span class="br0">)</span> <span class="sy1">></span> <span class="nu0">0</span></span></span></li>
|
|
<li>而若 <span class="t-c"><span class="mw-geshi cpp source-cpp">左操作数</span></span> 和 <span class="t-c"><span class="mw-geshi cpp source-cpp">右操作数</span></span> 相等/等价则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span>a <span class="sy1"><=></span> b<span class="br0">)</span> <span class="sy1">==</span> <span class="nu0">0</span></span></span>。</li>
|
|
</ul>
|
|
<p>如果操作数之一为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span> 类型而另一个不是,程序非良构。</p>
|
|
<p>若两个操作数均具有算术类型,或若一个具有无作用域枚举类型而另一个具有整型类型,则对各操作数应用一般算术转换,然后</p>
|
|
<ul>
|
|
<li>若需要进行除了从整型类型到浮点类型之外的窄化转换,则程序非良构。</li>
|
|
<li>否则,若各操作数均具有整型类型,则运算符产出 <a href="cpp-utility-compare-strong_ordering.html"><tt>std::strong_ordering</tt></a> 类型的纯右值:</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>若两个操作数算术上相等则为 <span class="t-lc">std::strong_ordering::equal</span>,</li>
|
|
<li>若第一操作数算术上小于第二个则为 <span class="t-lc">std::strong_ordering::less</span></li>
|
|
<li>否则为 <span class="t-lc">std::strong_ordering::greater</span>。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<ul>
|
|
<li>否则,操作数均具有浮点类型,而运算符产出 <a href="cpp-utility-compare-partial_ordering.html"><tt>std::partial_ordering</tt></a> 类型的纯右值。表达式 <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1"><=></span> b</span></span> 产出</li>
|
|
</ul>
|
|
<dl>
|
|
<dd>
|
|
<ul>
|
|
<li>若 <span class="t-c"><span class="mw-geshi cpp source-cpp">a</span></span> 小于 <span class="t-c"><span class="mw-geshi cpp source-cpp">b</span></span> 则为 <span class="t-lc">std::partial_ordering::less</span>,</li>
|
|
<li>若 <span class="t-c"><span class="mw-geshi cpp source-cpp">a</span></span> 大于 <span class="t-c"><span class="mw-geshi cpp source-cpp">b</span></span> 则为 <span class="t-lc">std::partial_ordering::greater</span>,</li>
|
|
<li>若 <span class="t-c"><span class="mw-geshi cpp source-cpp">a</span></span> 等价于 <span class="t-c"><span class="mw-geshi cpp source-cpp">b</span></span> 则为 <span class="t-lc">std::partial_ordering::equivalent</span>(<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">-</span><span class="nu0">0</span> <span class="sy1"><=></span> <span class="sy2">+</span><span class="nu0">0</span></span></span> 为等价),</li>
|
|
<li>否则为 <span class="t-lc">std::partial_ordering::unordered</span>(<span class="t-c"><span class="mw-geshi cpp source-cpp">NaN <span class="sy1"><=></span> 任何值</span></span> 为无序)。</li>
|
|
</ul>
|
|
</dd>
|
|
</dl>
|
|
<p>若两个操作数都具有相同的枚举类型 <code>E</code>,则运算符产出将各操作数转换为 E 的底层类型再对转换后的操作数应用 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1"><=></span></span></span> 的结果。</p>
|
|
<p>若至少一个操作数为指针或成员指针,则按需应用数组到指针转换、派生类到基类指针转换、函数指针转换和限定性转换,以将它们转换为同一指针类型,且结果指针类型为对象指针类型,则 <span class="t-c"><span class="mw-geshi cpp source-cpp">p <span class="sy1"><=></span> q</span></span> 返回 <a href="cpp-utility-compare-strong_ordering.html"><tt>std::strong_ordering</tt></a> 类型的纯右值:</p>
|
|
<ul>
|
|
<li>若 <span class="t-c"><span class="mw-geshi cpp source-cpp">p <span class="sy1">==</span> q</span></span> 则为 <span class="t-lc">std::strong_ordering::equal</span></li>
|
|
<li>若 <span class="t-c"><span class="mw-geshi cpp source-cpp">q <span class="sy1">></span> p</span></span> 则为 <span class="t-lc">std::strong_ordering::less</span></li>
|
|
<li>若 <span class="t-c"><span class="mw-geshi cpp source-cpp">p <span class="sy1">></span> q</span></span> 则为 <span class="t-lc">std::strong_ordering::greater</span>。</li>
|
|
<li>若未指明这些指针值的比较(例如它们不指向同一对象或数组之中时),则为未指明的结果。</li>
|
|
</ul>
|
|
<p>否则程序非良构。</p>
|
|
<p>在<a href="cpp-language-overload_resolution.html#.E8.B0.83.E7.94.A8.E9.87.8D.E8.BD.BD.E8.BF.90.E7.AE.97.E7.AC.A6">针对用户定义运算符的重载决议</a>中,对于指针或枚举类型 <code>T</code>,下列函数签名参与重载决议:</p>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl">
|
|
<td class="t-dcl-nopad">
|
|
<div><span class="mw-geshi cpp source-cpp">R operator<span class="sy1"><=></span><span class="br0">(</span>T, T<span class="br0">)</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td class="t-dcl-nopad"></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>其中 <code>R</code> 是上文所定义的顺序类别类型。</p>
|
|
<h4><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B_3">示例</span></h4>
|
|
<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="co2">#include <compare></span>
|
|
<span class="co2">#include <iostream></span>
|
|
|
|
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span> <span class="br0">{</span>
|
|
<span class="kw4">double</span> foo <span class="sy1">=</span> <span class="sy2">-</span><span class="nu16">0.0</span><span class="sy4">;</span>
|
|
<span class="kw4">double</span> bar <span class="sy1">=</span> <span class="nu16">0.0</span><span class="sy4">;</span>
|
|
|
|
<span class="kw4">auto</span> res <span class="sy1">=</span> foo <span class="sy1"><=></span> bar<span class="sy4">;</span>
|
|
|
|
<span class="kw1">if</span> <span class="br0">(</span>res <span class="sy1"><</span> <span class="nu0">0</span><span class="br0">)</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"-0 小于 0"</span><span class="sy4">;</span>
|
|
<span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">(</span>res <span class="sy1">></span> <span class="nu0">0</span><span class="br0">)</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"-0 大于 0"</span><span class="sy4">;</span>
|
|
<span class="kw1">else</span> <span class="co1">// (res == 0)</span>
|
|
<a href="cpp-io-cout.html"><span class="kw1758">std::<span class="me2">cout</span></span></a> <span class="sy1"><<</span> <span class="st0">"-0 与 0 相等"</span><span class="sy4">;</span>
|
|
<span class="br0">}</span></pre></div>
|
|
</div>
|
|
<p>输出:</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="text source-text">
|
|
<pre class="de1">-0 与 0 相等</pre></div>
|
|
</div>
|
|
</div>
|
|
<h4><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3_2">注解</span></h4>
|
|
<p>类类型可以自动生成三路比较,见<a href="cpp-language-default_comparisons.html">默认比较</a>。</p>
|
|
<p>如果两个运算数均为数组,则三路比较均为非良构。</p>
|
|
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
|
<div class="cpp source-cpp">
|
|
<pre class="de1"><span class="kw4">unsigned</span> <span class="kw4">int</span> i <span class="sy1">=</span> <span class="nu0">1</span><span class="sy4">;</span>
|
|
<span class="kw4">auto</span> r <span class="sy1">=</span> <span class="sy2">-</span><span class="nu0">1</span> <span class="sy1"><</span> i<span class="sy4">;</span> <span class="co1">// 既存陷阱:返回 false</span>
|
|
<span class="kw4">auto</span> r2 <span class="sy1">=</span> <span class="sy2">-</span><span class="nu0">1</span> <span class="sy1"><=></span> i<span class="sy4">;</span> <span class="co1">// 错误:要求窄化转换</span></pre></div>
|
|
</div>
|
|
<p><br /></p>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.A0.87.E5.87.86.E5.BA.93">标准库</span></h3>
|
|
<p>比较运算符为标准库中的许多类所重载。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-types-type_info-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>检查对象是否指代相同类型<br />
|
|
<span class="t-mark">(<code>std::type_info</code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-error-error_code-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个 <code>error_code</code><br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-error-error_condition-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较 <code>error_condition</code> 和 <code>error_code</code><br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-pair-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按字典序比较 pair 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-tuple-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按字典顺序比较 tuple 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-bitset-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较其内容<br />
|
|
<span class="t-mark">(<code>std::bitset<N></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-allocator-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个分配器实例<br />
|
|
<span class="t-mark">(<code>std::allocator<T></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-unique_ptr-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span></span><span></span><span></span><span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>与另一个 <code>unique_ptr</code> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp">nullptr</span></span> 进行比较<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-shared_ptr-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>与另一个 <code>shared_ptr</code> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp">nullptr</span></span> 进行比较<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-functional-function-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较 <span class="t-lc"><a href="cpp-utility-functional-function.html">std::function</a></span> 和 <span class="t-c"><span class="mw-geshi cpp source-cpp">nullptr</span></span><br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-chrono-duration-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个时长<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-chrono-time_point-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个时间点<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-scoped_allocator_adaptor-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个 scoped_allocator_adaptor 实例<br />
|
|
<span class="t-mark">(<code>std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-types-type_index-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span></span><span></span><span></span><span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较底层 <span class="t-lc"><a href="cpp-types-type_info.html">std::type_info</a></span> 对象<br />
|
|
<span class="t-mark">(<code>std::type_index</code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-string-basic_string-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator></span><span>operator<=</span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>以字典序比较两个字符串<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-locale-locale-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>locale 对象之间的相等性比较<br />
|
|
<span class="t-mark">(<code>std::locale</code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-array-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按照字典顺序比较 array 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-deque-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按照字典顺序比较 deque 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-forward_list-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按照字典顺序比较 forward_list 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-list-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按照字典顺序比较 list 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-vector-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按照字典顺序比较 vector 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-map-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按照字典顺序比较 map 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-multimap-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按照字典顺序比较 multimap 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-set-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按照字典顺序比较 set 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-multiset-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按照字典顺序比较 multiset 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-unordered_map-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较 unordered_map 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-unordered_multimap-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较 unordered_multimap 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-unordered_set-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较 unordered_set 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-unordered_multiset-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较 unordered_multiset 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-queue-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span></span><span></span><span></span><span></span><span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按照字典顺序比较 queue 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-container-stack-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span></span><span></span><span></span><span></span><span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>按照字典顺序比较 stack 中的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-iterator-reverse_iterator-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span></span><span></span><span></span><span></span><span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较底层迭代器<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-iterator-move_iterator-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较底层迭代器<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-iterator-istream_iterator-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个 <code>istream_iterator</code><br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-iterator-istreambuf_iterator-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个 <code>istreambuf_iterator</code><br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-complex-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个复数,或一个复数与一个标量<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-valarray-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个 valarrays,或比较一个 valarray 和一个值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-linear_congruential_engine-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个伪随机数引擎的内部状态<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-numeric-random-poisson_distribution-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span><span><span class="t-mark-rev t-since-cxx11">(C++11)</span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个分布对象<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-sub_match-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span><span>operator<=</span><span>operator></span><span>operator>=</span><span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较一个 <code>sub_match</code> 与另一 <code>sub_match</code> 、字符串或字符<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-match_results-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>以字典序比较两个匹配结果的值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-regex_iterator-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个 <code>regex_iterator</code><br />
|
|
<span class="t-mark">(<code>std::regex_iterator<BidirIt,CharT,Traits></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-regex-regex_token_iterator-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个 <code>regex_token_iterator</code><br />
|
|
<span class="t-mark">(<code>std::regex_token_iterator<BidirIt,CharT,Traits></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-thread-thread-id-operator_cmp.html"><span class="t-lines"><span>operator==</span><span>operator!=</span><span>operator<</span> <span>operator<=</span> <span>operator></span> <span>operator>=</span> <span>operator<=></span></span></a></div>
|
|
<div><span class="t-lines"><span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-until-cxx20">(C++20 中移除)</span></span><span><span class="t-mark-rev t-since-cxx20">(C++20)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>比较两个 <code>thread::id</code> 对象<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
<p>命名空间 <a href="cpp-utility-rel_ops-operator_cmp.html"><tt>std::rel_ops</tt></a> 提供了泛型运算符 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">!</span><span class="sy1">=</span></span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1">></span></span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1"><=</span></span></span> 及 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy1">>=</span></span></span></p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于头文件 <code><a href="cpp-header-utility.html"><utility></a></code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc-header">
|
|
<td colspan="2">
|
|
<div>定义于命名空间 <code>std::rel_ops</code></div>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-rel_ops-operator_cmp.html"><span class="t-lines"><span>operator!=</span><span>operator></span><span>operator<=</span><span>operator>=</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark">(C++20 中弃用)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>自动生成基于用户定义的 <span class="t-c"><span class="mw-geshi cpp source-cpp">operator<span class="sy1">==</span></span></span> 和 <span class="t-c"><span class="mw-geshi cpp source-cpp">operator<span class="sy1"><</span></span></span> 的比较运算符<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">缺陷报告</span></h3>
|
|
<p>下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。</p>
|
|
<table class="dsctable" style="font-size:0.8em">
|
|
<tr>
|
|
<th>DR</th>
|
|
<th>应用于</th>
|
|
<th>出版时的行为</th>
|
|
<th>正确行为</th>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue583">CWG 583</a></td>
|
|
<td>C++98<br />
|
|
C++11</td>
|
|
<td>所有六个比较运算符均能用于比较指针和 <code>nullptr</code> (C++11) 或另一空指针常量 (C++98)</td>
|
|
<td>仅允许相等性运算符</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue1512">CWG 1512</a></td>
|
|
<td>C++98</td>
|
|
<td>合成指针类型的规则不完整,从而不允许 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">int</span><span class="sy2">**</span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">const</span> <span class="kw4">int</span><span class="sy2">**</span></span></span> 间的比较</td>
|
|
<td>使之完整</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://wg21.cmeerw.net/cwg/issue1596">CWG 1596</a></td>
|
|
<td>C++98</td>
|
|
<td>仅就指针算术的目的认为非数组对象属于拥有一个元素的数组</td>
|
|
<td>该规则亦适用于比较</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<ul>
|
|
<li><a href="cpp-language-operator_precedence.html">运算符优先级</a></li>
|
|
<li><a href="cpp-language-operators.html">运算符重载</a></li>
|
|
<li><a href="cpp-named_req-Compare.html"><span style="font-style:italic">比较</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(Compare)</span></a> (具名要求)</li>
|
|
</ul>
|
|
<table class="wikitable">
|
|
<tr style="text-align:center">
|
|
<th colspan="7">常见运算符</th>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td><a href="cpp-language-operator_assignment.html">赋值</a></td>
|
|
<td><a href="cpp-language-operator_incdec.html">自增<br />
|
|
自减</a></td>
|
|
<td><a href="cpp-language-operator_arithmetic.html">算术</a></td>
|
|
<td><a href="cpp-language-operator_logical.html">逻辑</a></td>
|
|
<td><strong class="selflink">比较</strong></td>
|
|
<td><a href="cpp-language-operator_member_access.html">成员访问</a></td>
|
|
<td><a href="cpp-language-operator_other.html">其他</a></td>
|
|
</tr>
|
|
<tr style="text-align:center">
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">=</span> b<br />
|
|
a <span class="sy2">+</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">-</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">*</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">/</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy2">%</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy3">&</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy3">|</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy3">^</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy1"><<=</span> b<br />
|
|
a <span class="sy1">>>=</span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">++</span>a<br />
|
|
<span class="sy2">--</span>a<br />
|
|
a<span class="sy2">++</span><br />
|
|
a<span class="sy2">--</span></span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">+</span>a<br />
|
|
<span class="sy2">-</span>a<br />
|
|
a <span class="sy2">+</span> b<br />
|
|
a <span class="sy2">-</span> b<br />
|
|
a <span class="sy2">*</span> b<br />
|
|
a <span class="sy2">/</span> b<br />
|
|
a <span class="sy2">%</span> b<br />
|
|
~a<br />
|
|
a <span class="sy3">&</span> b<br />
|
|
a <span class="sy3">|</span> b<br />
|
|
a <span class="sy3">^</span> b<br />
|
|
a <span class="sy1"><<</span> b<br />
|
|
a <span class="sy1">>></span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">!</span>a<br />
|
|
a <span class="sy3">&&</span> b<br />
|
|
a <span class="sy3">||</span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">==</span> b<br />
|
|
a <span class="sy3">!</span><span class="sy1">=</span> b<br />
|
|
a <span class="sy1"><</span> b<br />
|
|
a <span class="sy1">></span> b<br />
|
|
a <span class="sy1"><=</span> b<br />
|
|
a <span class="sy1">>=</span> b<br />
|
|
a <span class="sy1"><=></span> b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="br0">[</span>b<span class="br0">]</span><br />
|
|
<span class="sy2">*</span>a<br />
|
|
<span class="sy3">&</span>a<br />
|
|
a<span class="sy2">-</span><span class="sy1">></span>b<br />
|
|
a.<span class="me1">b</span><br />
|
|
a<span class="sy2">-</span><span class="sy1">></span><span class="sy2">*</span>b<br />
|
|
a.<span class="sy2">*</span>b</span></span></p>
|
|
</td>
|
|
<td>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="br0">(</span>...<span class="br0">)</span><br />
|
|
a, b<br />
|
|
<span class="sy4">?</span> <span class="sy4">:</span></span></span></p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<th colspan="7">特殊运算符</th>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="7">
|
|
<p><a href="cpp-language-static_cast.html"><tt>static_cast</tt></a> 转换一个类型为另一相关类型<br />
|
|
<a href="cpp-language-dynamic_cast.html"><tt>dynamic_cast</tt></a> 在继承层级中转换<br />
|
|
<a href="cpp-language-const_cast.html"><tt>const_cast</tt></a> 添加或移除 <a href="cpp-language-cv.html">cv</a> 限定符<br />
|
|
<a href="cpp-language-reinterpret_cast.html"><tt>reinterpret_cast</tt></a> 转换类型到无关类型<br />
|
|
<a href="cpp-language-explicit_cast.html">C 风格转型</a> 以 <code>static_cast</code> 、 <code>const_cast</code> 及 <code>reinterpret_cast</code> 的混合转换一个类型到另一类型<br />
|
|
<a href="cpp-language-new.html"><tt>new</tt></a> 创建有动态存储期的对象<br />
|
|
<a href="cpp-language-delete.html"><tt>delete</tt></a> 销毁先前由 new 表达式创建的对象,并释放其所拥有的内存区域<br />
|
|
<a href="cpp-language-sizeof.html"><tt>sizeof</tt></a> 查询类型的大小<br />
|
|
<a href="cpp-language-sizeof....html"><tt>sizeof...</tt></a> 查询<a href="cpp-language-parameter_pack.html">形参包</a>的大小<span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
|
<a href="cpp-language-typeid.html"><tt>typeid</tt></a> 查询类型的类型信息<br />
|
|
<a href="cpp-language-noexcept.html"><tt>noexcept</tt></a> 查询表达式是否能抛出异常<span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
|
<a href="cpp-language-alignof.html"><tt>alignof</tt></a> 查询类型的对齐要求<span class="t-mark-rev t-since-cxx11">(C++11 起)</span></p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|