205 lines
14 KiB
HTML
205 lines
14 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::experimental::unique_resource</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_experimental_unique_resource 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::experimental::</span>unique_resource</h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-experimental.html">experimental</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="https://zh.cppreference.com/mwiki/index.php?title=cpp/header/experimental/scope&action=edit&redlink=1" class="new" title="cpp/header/experimental/scope(页面不存在)"><experimental/scope></a></code></div>
|
|
</td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
<tr class="t-dcl t-since-libfund_ts_3">
|
|
<td>
|
|
<div><span class="mw-geshi cpp source-cpp"><span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span> R, <span class="kw1">class</span> D<span class="sy1">></span><br />
|
|
<span class="kw1">class</span> unique_resource<span class="sy4">;</span></span></div>
|
|
</td>
|
|
<td class="t-dcl-nopad"></td>
|
|
<td><span class="t-mark-rev t-since-libfund-ts-3 t-mark-ts">(库基础 TS v3)</span></td>
|
|
</tr>
|
|
<tr class="t-dcl-sep">
|
|
<td></td>
|
|
<td></td>
|
|
<td></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
<p><code>unique_resource</code> 是通用的资源柄 RAII 包装,通过柄占有并管理资源,并在 <code>unique_resource</code> 销毁时释放该资源。</p>
|
|
<p>在以下任一情况发生时,用 <code>D</code> 类型删除器释放资源:</p>
|
|
<ul>
|
|
<li>销毁管理的 <code>unique_resource</code> 对象</li>
|
|
<li>经由 <span class="t-lc">operator=</span> 或 <span class="t-lc">reset()</span> 赋另一资源给 <code>unique_resource</code> 对象。</li>
|
|
</ul>
|
|
<p>若 <code>R</code> 为对象类型则令 <code>RS</code> 为 <code>R</code> ,否则为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-functional-reference_wrapper.html"><span class="kw1068">std::<span class="me2">reference_wrapper</span></span></a><span class="sy1"><</span><a href="cpp-types-remove_reference.html"><span class="kw607">std::<span class="me2">remove_reference_t</span></span></a><span class="sy1"><</span>R<span class="sy1">>></span></span></span> :</p>
|
|
<ul>
|
|
<li><code>unique_resource</code> 等效地保有包装或作为资源柄的 <code>RS</code> 类型子对象、 <code>D</code> 类型删除器及指示包装是否占有资源的 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">bool</span></span></span> 标志。</li>
|
|
<li>为解释目的,称 <code>RS</code> 为<i>存储的资源柄</i>,存储(若 <code>R</code> 为对象类型)或包装(若 <code>R</code> 为引用类型)的 <code>R</code> 为<i>底层资源柄</i>。 LFTS 不使用此二用语。</li>
|
|
</ul>
|
|
<h3><span class="mw-headline" id=".E6.A8.A1.E6.9D.BF.E5.BD.A2.E5.8F.82">模板形参</span></h3>
|
|
<table class="t-par-begin">
|
|
<tr class="t-par">
|
|
<td>R</td>
|
|
<td>-</td>
|
|
<td>资源柄类型</td>
|
|
</tr>
|
|
<tr class="t-par">
|
|
<td>D</td>
|
|
<td>-</td>
|
|
<td>删除器类型</td>
|
|
</tr>
|
|
<tr class="t-par-hitem">
|
|
<td colspan="3">类型要求</td>
|
|
</tr>
|
|
<tr class="t-par-req">
|
|
<td colspan="3">-
|
|
<div class="spacer"></div>
|
|
<code>R</code> 应当为对象类型或到对象的左值引用类型。令 <code>UnrefR</code> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-remove_reference.html"><span class="kw607">std::<span class="me2">remove_reference_t</span></span></a><span class="sy1"><</span>R<span class="sy1">></span></span></span> ,则 <code>UnrefR</code> 应当为<a href="cpp-named_req-MoveConstructible.html"><span style="font-style:italic">可移动构造</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(MoveConstructible)</span></a> ,而若 <code>UnrefR</code> 非<a href="cpp-named_req-CopyConstructible.html"><span style="font-style:italic">可复制构造</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(CopyConstructible)</span></a> ,则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_move_constructible.html"><span class="kw543">std::<span class="me2">is_nothrow_move_constructible_v</span></span></a><span class="sy1"><</span>UnrefR<span class="sy1">></span></span></span> 应当为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 。</td>
|
|
</tr>
|
|
<tr class="t-par-req">
|
|
<td colspan="3">-
|
|
<div class="spacer"></div>
|
|
<code>D</code> 应当为<a href="cpp-named_req-Destructible.html"><span style="font-style:italic">可析构</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(Destructible)</span></a> 且<a href="cpp-named_req-MoveConstructible.html"><span style="font-style:italic">可移动构造</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(MoveConstructible)</span></a> 的<a href="cpp-named_req-FunctionObject.html"><span style="font-style:italic">函数对象</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(FunctionObject)</span></a> 类型,而若 <code>D</code> 非<a href="cpp-named_req-CopyConstructible.html"><span style="font-style:italic">可复制构造</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(CopyConstructible)</span></a> ,则 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_move_constructible.html"><span class="kw543">std::<span class="me2">is_nothrow_move_constructible_v</span></span></a><span class="sy1"><</span>R<span class="sy1">></span></span></span> 应当为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 。 给定 <code>D</code> 类型左值 <code>d</code> 与 <code>UnrefR</code> 类型左值 <code>r</code> ,表达式 <span class="t-c"><span class="mw-geshi cpp source-cpp">d<span class="br0">(</span>r<span class="br0">)</span></span></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 t-dsc-member-nobold-div">
|
|
<div><a href="cpp-experimental-unique_resource-unique_resource.html"><span class="t-lines"><span>(构造函数)</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>构造新的 <code>unique_resource</code><br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div t-dsc-member-nobold-div">
|
|
<div><a href="cpp-experimental-unique_resource-~unique_resource.html"><span class="t-lines"><span>(析构函数)</span></span></a></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-experimental-unique_resource-operator=.html"><span class="t-lines"><span>operator=</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>赋值 <code>unique_resource</code><br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<h5><span class="mw-headline" id=".E4.BF.AE.E6.94.B9.E5.99.A8">修改器</span></h5>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-experimental-unique_resource-release.html"><span class="t-lines"><span>release</span></span></a></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-experimental-unique_resource-reset.html"><span class="t-lines"><span>reset</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>释放或替换被管理的资源<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<h5><span class="mw-headline" id=".E8.A7.82.E5.AF.9F.E5.99.A8">观察器</span></h5>
|
|
</td>
|
|
</tr>
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-experimental-unique_resource-get.html"><span class="t-lines"><span>get</span></span></a></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-experimental-unique_resource-get_deleter.html"><span class="t-lines"><span>get_deleter</span></span></a></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-experimental-unique_resource-operator*.html"><span class="t-lines"><span>operator*</span><span>operator-></span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>访问被指向者,若资源柄为指针<br />
|
|
<span class="t-mark">(公开成员函数)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E9.9D.9E.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><a href="cpp-experimental-unique_resource-make_unique_resource_checked.html"><span class="t-lines"><span>make_unique_resource_checked</span></span></a></div>
|
|
</div>
|
|
</td>
|
|
<td>创建 <code>unique_resource</code> ,检查非法值<br />
|
|
<span class="t-mark">(函数模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.8E.A8.E5.AF.BC.E6.8C.87.E5.BC.95"><a href="cpp-experimental-unique_resource-deduction_guides.html">推导指引</a></span></h3>
|
|
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
|
<p>满足<a href="cpp-named_req-NullablePointer.html"><span style="font-style:italic">可空指针</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(NullablePointer)</span></a> 的资源柄类型亦能由 <span class="t-lc"><a href="cpp-memory-unique_ptr.html">std::unique_ptr</a></span> 管理。不同于 <code>unique_ptr</code> , <code>unique_resource</code> 不要求<a href="cpp-named_req-NullablePointer.html"><span style="font-style:italic">可空指针</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(NullablePointer)</span></a> 。</p>
|
|
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
|
<table class="metadata plainlinks ambox mbox-small-left ambox-notice" style="">
|
|
<tr>
|
|
<td class="mbox-empty-cell"></td>
|
|
<td class="mbox-text" style="">本节未完成<br />
|
|
原因:暂无示例</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-unique_ptr.html"><span class="t-lines"><span>unique_ptr</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>拥有独有对象所有权语义的智能指针<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|