285 lines
19 KiB
HTML
285 lines
19 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>std::owner_less</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_memory_owner_less skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">std::</span>owner_less</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-memory.html">memory</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dsc-header">
|
|
<td>
|
|
<div>定义于头文件 <code><a href="cpp-header-memory.html"><memory></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody class="t-dcl-rev t-dcl-rev-num">
|
|
<tr class="t-dcl-rev-aux">
|
|
<td></td>
|
|
<td rowspan="142">(1)</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11 t-until-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1"><</span> <span class="kw1">class</span> T <span class="sy1">></span><br />
|
|
<span class="kw1">struct</span> owner_less<span class="sy4">;</span> <span class="coMULTI">/* undefined */</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
|
<span class="t-mark-rev t-until-cxx17">(C++17 前)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1"><</span> <span class="kw1">class</span> T <span class="sy1">=</span> <span class="kw4">void</span> <span class="sy1">></span><br />
|
|
<span class="kw1">struct</span> owner_less<span class="sy4">;</span> <span class="coMULTI">/* undefined */</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</tbody>
|
|
<tbody>
|
|
<tr class="t-dcl t-since-cxx11">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1"><</span> <span class="kw1">class</span> T <span class="sy1">></span><br />
|
|
<span class="kw1">struct</span> owner_less<span class="sy1"><</span><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">>></span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(2)</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1"><</span> <span class="kw1">class</span> T <span class="sy1">></span><br />
|
|
<span class="kw1">struct</span> owner_less<span class="sy1"><</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">>></span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(3)</td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx17">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1"><></span><br />
|
|
<span class="kw1">struct</span> owner_less<span class="sy1"><</span><span class="kw4">void</span><span class="sy1">></span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td>(4)</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>此函数对象提供基于拥有者(不同于基于值)的, <span class="t-lc"><a href="cpp-memory-weak_ptr.html">std::weak_ptr</a></span> 和 <span class="t-lc"><a href="cpp-memory-shared_ptr.html">std::shared_ptr</a></span> 两者的混合类型序。顺序满足二个智能指针比较相等,若且唯若它们均为空或共享所有权,即使由 <code>get()</code> 获得的裸指针值相异(例如因为它们指向同一对象中的不同子对象)。</p>
|
|
<p>在以 <span class="t-lc"><a href="cpp-memory-shared_ptr.html">std::shared_ptr</a></span> 或 <span class="t-lc"><a href="cpp-memory-weak_ptr.html">std::weak_ptr</a></span> 为关键建立关联容器,即</p>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-container-map.html"><span class="kw1280">std::<span class="me2">map</span></span></a><span class="sy1"><</span><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span>, U, std<span class="sy4">::</span><span class="me2">owner_less</span><span class="sy1"><</span><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">>>></span></span></span></p>
|
|
<p>或</p>
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-container-map.html"><span class="kw1280">std::<span class="me2">map</span></span></a><span class="sy1"><</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span>, U, std<span class="sy4">::</span><span class="me2">owner_less</span><span class="sy1"><</span><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">>>></span></span></span> 时,最好使用此类模板。</p>
|
|
<p>默认的 <span class="t-c"><span class="mw-geshi cpp source-cpp">operator<span class="sy1"><</span></span></span> 不为弱指针定义,并且可能错误地认为同一对象的二个共享指针不等价(见 <a href="cpp-memory-shared_ptr-owner_before.html"><tt>shared_ptr::owner_before</tt></a> )。</p>
|
|
<h3><span class="mw-headline" id=".E7.89.B9.E5.8C.96">特化</span></h3>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-since-cxx17">
|
|
<td>
|
|
<p>标准库提供 <code>std::owner_less</code> 在不指定 <code>T</code> 时的特化。此情况下,从实参类型推导形参类型(每个实参都必须是 <span class="t-lc"><a href="cpp-memory-shared_ptr.html">std::shared_ptr</a></span> 或 <span class="t-lc"><a href="cpp-memory-weak_ptr.html">std::weak_ptr</a></span> )。</p>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-owner_less_void.html"><span class="t-lines"><span>owner_less<span class="t-dsc-small"><void></span></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>为共享指针和弱指针提供混合类型的、基于拥有者的顺序的函数对象,无关乎被指向的类型<br />
|
|
<span class="t-mark">(类模板特化)</span></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td><span class="t-mark-rev t-since-cxx17">(C++17 起)</span></td>
|
|
</tr>
|
|
</table>
|
|
<table class="t-rev-begin">
|
|
<tr class="t-rev t-until-cxx20">
|
|
<td>
|
|
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E7.B1.BB.E5.9E.8B">成员类型</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc-hitem">
|
|
<td>成员类型</td>
|
|
<td>定义</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>result_type</code><span class="t-mark">(C++17 中弃用)</span></td>
|
|
<td>2-3) <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>first_argument_type</code><span class="t-mark">(C++17 中弃用)</span></td>
|
|
<td>2) <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span></span></span><br />
|
|
3) <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span></span></span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td><code>second_argument_type</code><span class="t-mark">(C++17 中弃用)</span></td>
|
|
<td>2) <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span></span></span><br />
|
|
3) <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span></span></span></td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
<td><span class="t-mark-rev t-until-cxx20">(C++20 前)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.88.90.E5.91.98.E5.87.BD.E6.95.B0">成员函数</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><strong class="selflink"><span class="t-lines"><span>operator()</span></span></strong></div>
|
|
</div>
|
|
</td>
|
|
<td>用基于拥有者的语义比较其参数<br />
|
|
<span class="t-mark">(函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
<div class="t-member">
|
|
<h2><span class="mw-headline" id="std::owner_less::operator.28.29"><span style="font-size:0.7em; line-height:130%">std::owner_less::</span>operator()</span></h2>
|
|
<table class="t-dcl-begin">
|
|
<tbody>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl-h">
|
|
<td>
|
|
<div>所有模板特化的成员</div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="br0">(</span><span class="br0">)</span><span class="br0">(</span> <span class="kw4">const</span> <a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> lhs,<br />
|
|
<span class="kw4">const</span> <a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> rhs <span class="br0">)</span> <span class="kw4">const</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="br0">(</span><span class="br0">)</span><span class="br0">(</span> <span class="kw4">const</span> <a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> lhs,<br />
|
|
<span class="kw4">const</span> <a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> rhs <span class="br0">)</span> <span class="kw4">const</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl-h">
|
|
<td>
|
|
<div>仅为 <code>owner_less<shared_ptr<T>></code> 模板特化的成员</div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="br0">(</span><span class="br0">)</span><span class="br0">(</span> <span class="kw4">const</span> <a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> lhs,<br />
|
|
<span class="kw4">const</span> <a href="cpp-memory-shared_ptr.html"><span class="kw734">std::<span class="me2">shared_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> rhs <span class="br0">)</span> <span class="kw4">const</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl-h">
|
|
<td>
|
|
<div>仅为 <code>owner_less<weak_ptr<T>></code> 模板特化的成员</div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-cxx11">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span> operator<span class="br0">(</span><span class="br0">)</span><span class="br0">(</span> <span class="kw4">const</span> <a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> lhs,<br />
|
|
<span class="kw4">const</span> <a href="cpp-memory-weak_ptr.html"><span class="kw741">std::<span class="me2">weak_ptr</span></span></a><span class="sy1"><</span>T<span class="sy1">></span><span class="sy3">&</span> rhs <span class="br0">)</span> <span class="kw4">const</span> <span class="kw1">noexcept</span><span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p>用基于拥有者的语义比较 <code>lhs</code> 与 <code>rhs</code> 。等效于调用 <span class="t-c"><span class="mw-geshi cpp source-cpp">lhs.<span class="me1">owner_before</span><span class="br0">(</span>rhs<span class="br0">)</span></span></span> 。</p>
|
|
<p>顺序是严格弱序关系。</p>
|
|
<p><code>lhs</code> 与 <code>rhs</code> 相等,当且仅当它们均为空或共享所有权。</p>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0">参数</span></h3>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td>lhs, rhs</td>
|
|
<td>-</td>
|
|
<td>要比较的共享所有权指针</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E8.BF.94.E5.9B.9E.E5.80.BC">返回值</span></h3>
|
|
<p>若按基于拥有者的顺序确定 <code>lhs</code> <i>小于</i> <code>rhs</code> ,则为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 。</p>
|
|
</div>
|
|
<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://cplusplus.github.io/LWG/issue2873">LWG 2873</a></td>
|
|
<td>C++11</td>
|
|
<td>operator() 可以不声明为 noexcept</td>
|
|
<td>声明为 noexcept</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-shared_ptr-owner_before.html"><span class="t-lines"><span>owner_before</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>提供基于拥有者的共享指针排序<br />
|
|
<span class="t-mark">(<code>std::shared_ptr<T></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-memory-weak_ptr-owner_before.html"><span class="t-lines"><span>owner_before</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>提供弱指针的基于拥有者顺序<br />
|
|
<span class="t-mark">(<code>std::weak_ptr<T></code> 的公开成员函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|