上传cppreference
This commit is contained in:
@@ -0,0 +1,466 @@
|
||||
<!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::tuple<Types...>::tuple</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_utility_tuple_tuple 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::tuple<Types...>::</span>tuple</h1>
|
||||
<div id="bodyContent">
|
||||
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-utility.html">utility</a>‎ | <a href="cpp-utility-tuple.html">tuple</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-tuple.html"><tuple></a></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">constexpr</span> tuple<span class="br0">(</span><span class="br0">)</span><span class="sy4">;</span></span></div>
|
||||
</td>
|
||||
<td>(1)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</span></td>
|
||||
</tr>
|
||||
<tr class="t-dcl t-since-cxx11">
|
||||
<td>
|
||||
<div><span class="mw-geshi cpp source-cpp">tuple<span class="br0">(</span> <span class="kw4">const</span> Types<span class="sy3">&</span>... <span class="me1">args</span> <span class="br0">)</span><span class="sy4">;</span></span></div>
|
||||
</td>
|
||||
<td>(2)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++14 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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>... <span class="me1">UTypes</span> <span class="sy1">></span><br />
|
||||
tuple<span class="br0">(</span> UTypes<span class="sy3">&&</span>... <span class="me1">args</span> <span class="br0">)</span><span class="sy4">;</span></span></div>
|
||||
</td>
|
||||
<td>(3)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++14 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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>... <span class="me1">UTypes</span> <span class="sy1">></span><br />
|
||||
tuple<span class="br0">(</span> <span class="kw4">const</span> tuple<span class="sy1"><</span>UTypes...<span class="sy1">></span><span class="sy3">&</span> other <span class="br0">)</span><span class="sy4">;</span></span></div>
|
||||
</td>
|
||||
<td>(4)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++14 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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>... <span class="me1">UTypes</span><span class="sy1">></span><br />
|
||||
tuple<span class="br0">(</span> tuple<span class="sy1"><</span>UTypes...<span class="sy1">></span><span class="sy3">&&</span> other <span class="br0">)</span><span class="sy4">;</span></span></div>
|
||||
</td>
|
||||
<td>(5)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++14 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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> U1, <span class="kw1">class</span> U2 <span class="sy1">></span><br />
|
||||
tuple<span class="br0">(</span> <span class="kw4">const</span> pair<span class="sy1"><</span>U1,U2<span class="sy1">></span><span class="sy3">&</span> p <span class="br0">)</span><span class="sy4">;</span></span></div>
|
||||
</td>
|
||||
<td>(6)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++14 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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> U1, <span class="kw1">class</span> U2 <span class="sy1">></span><br />
|
||||
tuple<span class="br0">(</span> pair<span class="sy1"><</span>U1,U2<span class="sy1">></span><span class="sy3">&&</span> p <span class="br0">)</span><span class="sy4">;</span></span></div>
|
||||
</td>
|
||||
<td>(7)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++14 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</span></td>
|
||||
</tr>
|
||||
<tr class="t-dcl t-since-cxx11">
|
||||
<td>
|
||||
<div><span class="mw-geshi cpp source-cpp">tuple<span class="br0">(</span> <span class="kw4">const</span> tuple<span class="sy3">&</span> other <span class="br0">)</span> <span class="sy1">=</span> <span class="kw1">default</span><span class="sy4">;</span></span></div>
|
||||
</td>
|
||||
<td>(8)</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">tuple<span class="br0">(</span> tuple<span class="sy3">&&</span> other <span class="br0">)</span> <span class="sy1">=</span> <span class="kw1">default</span><span class="sy4">;</span></span></div>
|
||||
</td>
|
||||
<td>(9)</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> Alloc <span class="sy1">></span><br />
|
||||
tuple<span class="br0">(</span> <a href="cpp-memory-allocator_arg_t.html"><span class="kw702">std::<span class="me2">allocator_arg_t</span></span></a>, <span class="kw4">const</span> Alloc<span class="sy3">&</span> a <span class="br0">)</span><span class="sy4">;</span></span></div>
|
||||
</td>
|
||||
<td>(10)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++20 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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> Alloc <span class="sy1">></span><br /></span>
|
||||
<p>tuple<span class="br0">(</span> <a href="cpp-memory-allocator_arg_t.html"><span class="kw702">std::<span class="me2">allocator_arg_t</span></span></a>, <span class="kw4">const</span> Alloc<span class="sy3">&</span> a,<br /></p>
|
||||
<span class="kw4">const</span> Types<span class="sy3">&</span>... <span class="me1">args</span> <span class="br0">)</span><span class="sy4">;</span></div>
|
||||
</td>
|
||||
<td>(11)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++20 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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> Alloc, <span class="kw1">class</span>... <span class="me1">UTypes</span> <span class="sy1">></span><br /></span>
|
||||
<p>tuple<span class="br0">(</span> <a href="cpp-memory-allocator_arg_t.html"><span class="kw702">std::<span class="me2">allocator_arg_t</span></span></a>, <span class="kw4">const</span> Alloc<span class="sy3">&</span> a,<br /></p>
|
||||
UTypes<span class="sy3">&&</span>... <span class="me1">args</span> <span class="br0">)</span><span class="sy4">;</span></div>
|
||||
</td>
|
||||
<td>(12)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++20 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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> Alloc, <span class="kw1">class</span>... <span class="me1">UTypes</span><span class="sy1">></span><br /></span>
|
||||
<p>tuple<span class="br0">(</span> <a href="cpp-memory-allocator_arg_t.html"><span class="kw702">std::<span class="me2">allocator_arg_t</span></span></a>, <span class="kw4">const</span> Alloc<span class="sy3">&</span> a,<br /></p>
|
||||
<span class="kw4">const</span> tuple<span class="sy1"><</span>UTypes...<span class="sy1">></span><span class="sy3">&</span> other <span class="br0">)</span><span class="sy4">;</span></div>
|
||||
</td>
|
||||
<td>(13)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++20 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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> Alloc, <span class="kw1">class</span>... <span class="me1">UTypes</span> <span class="sy1">></span><br /></span>
|
||||
<p>tuple<span class="br0">(</span> <a href="cpp-memory-allocator_arg_t.html"><span class="kw702">std::<span class="me2">allocator_arg_t</span></span></a>, <span class="kw4">const</span> Alloc<span class="sy3">&</span> a,<br /></p>
|
||||
tuple<span class="sy1"><</span>UTypes...<span class="sy1">></span><span class="sy3">&&</span> other <span class="br0">)</span><span class="sy4">;</span></div>
|
||||
</td>
|
||||
<td>(14)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++20 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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> Alloc, <span class="kw1">class</span> U1, <span class="kw1">class</span> U2 <span class="sy1">></span><br /></span>
|
||||
<p>tuple<span class="br0">(</span> <a href="cpp-memory-allocator_arg_t.html"><span class="kw702">std::<span class="me2">allocator_arg_t</span></span></a>, <span class="kw4">const</span> Alloc<span class="sy3">&</span> a,<br /></p>
|
||||
<span class="kw4">const</span> pair<span class="sy1"><</span>U1, U2<span class="sy1">></span><span class="sy3">&</span> p <span class="br0">)</span><span class="sy4">;</span></div>
|
||||
</td>
|
||||
<td>(15)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++20 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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> Alloc, <span class="kw1">class</span> U1, <span class="kw1">class</span> U2 <span class="sy1">></span><br /></span>
|
||||
<p>tuple<span class="br0">(</span> <a href="cpp-memory-allocator_arg_t.html"><span class="kw702">std::<span class="me2">allocator_arg_t</span></span></a>, <span class="kw4">const</span> Alloc<span class="sy3">&</span> a,<br /></p>
|
||||
pair<span class="sy1"><</span>U1, U2<span class="sy1">></span><span class="sy3">&&</span> p <span class="br0">)</span><span class="sy4">;</span></div>
|
||||
</td>
|
||||
<td>(16)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++20 起为 <code>constexpr</code>)</span><br />
|
||||
<span class="t-mark">(条件性 <code>explicit</code>)</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> Alloc <span class="sy1">></span><br /></span>
|
||||
<p>tuple<span class="br0">(</span> <a href="cpp-memory-allocator_arg_t.html"><span class="kw702">std::<span class="me2">allocator_arg_t</span></span></a>, <span class="kw4">const</span> Alloc<span class="sy3">&</span> a,<br /></p>
|
||||
<span class="kw4">const</span> tuple<span class="sy3">&</span> other <span class="br0">)</span><span class="sy4">;</span></div>
|
||||
</td>
|
||||
<td>(17)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++20 起为 <code>constexpr</code>)</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> Alloc <span class="sy1">></span><br /></span>
|
||||
<p>tuple<span class="br0">(</span> <a href="cpp-memory-allocator_arg_t.html"><span class="kw702">std::<span class="me2">allocator_arg_t</span></span></a>, <span class="kw4">const</span> Alloc<span class="sy3">&</span> a,<br /></p>
|
||||
tuple<span class="sy3">&&</span> other <span class="br0">)</span><span class="sy4">;</span></div>
|
||||
</td>
|
||||
<td>(18)</td>
|
||||
<td><span class="t-mark-rev t-since-cxx11">(C++11 起)</span><br />
|
||||
<span class="t-mark">(C++20 起为 <code>constexpr</code>)</span></td>
|
||||
</tr>
|
||||
<tr class="t-dcl-sep">
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p>构造新的 <code>tuple</code> 。</p>
|
||||
<div class="t-li1"><span class="t-li">1)</span> 默认构造函数。<a href="cpp-language-value_initialization.html">值初始化</a>所有元素,若存在。若 <span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>Types<span class="br0">)</span> <span class="sy1">==</span> <span class="nu0">0</span></span></span> 则默认构造函数为平凡。
|
||||
<ul>
|
||||
<li>此重载仅若 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_default_constructible.html"><span class="kw526">std::<span class="me2">is_default_constructible</span></span></a><span class="sy1"><</span>Ti<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 对所有 <code>i</code> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 才参与重载决议。</li>
|
||||
<li>构造函数若且唯若对至少一个 <code>i</code> 有 <code>Ti</code> 不可从 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">{</span><span class="br0">}</span></span></span> 复制列表初始化才为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">explicit</span></span></span> 。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="t-li1"><span class="t-li">2)</span> 直接构造函数。以对应参数初始化 tuple 的每个元素。
|
||||
<ul>
|
||||
<li>此重载仅若 <span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>Types<span class="br0">)</span> <span class="sy1">>=</span> <span class="nu0">1</span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_copy_constructible.html"><span class="kw532">std::<span class="me2">is_copy_constructible</span></span></a><span class="sy1"><</span>Ti<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 对所有 <code>i</code> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 才参与重载决议。</li>
|
||||
<li>此构造函数若且唯若 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_convertible.html"><span class="kw592">std::<span class="me2">is_convertible</span></span></a><span class="sy1"><</span><span class="kw4">const</span> Ti<span class="sy3">&</span>, Ti<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 对至少一个 <code>i</code> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> 才为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">explicit</span></span></span> 。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="t-li1"><span class="t-li">3)</span> 转换构造函数。以 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-forward.html"><span class="kw1117">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>UTypes<span class="sy1">></span><span class="br0">(</span>args<span class="br0">)</span></span></span> 中的对应值初始化 tuple 的每个元素。
|
||||
<ul>
|
||||
<li>此重载仅若 <span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>Types<span class="br0">)</span> <span class="sy1">==</span> sizeof...<span class="br0">(</span>UTypes<span class="br0">)</span></span></span> 且 <span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>Types<span class="br0">)</span> <span class="sy1">>=</span> <span class="nu0">1</span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_constructible.html"><span class="kw520">std::<span class="me2">is_constructible</span></span></a><span class="sy1"><</span>Ti, Ui<span class="sy3">&&</span><span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 对所有 <code>i</code> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 才参与重载决议。</li>
|
||||
<li>构造函数若且唯若才 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_convertible.html"><span class="kw592">std::<span class="me2">is_convertible</span></span></a><span class="sy1"><</span>Ui<span class="sy3">&&</span>, Ti<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 对至少一个 <span class="t-c"><span class="mw-geshi cpp source-cpp">i</span></span> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">explicit</span></span></span> 。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="t-li1"><span class="t-li">4)</span> 转换复制构造函数。对 <span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>UTypes<span class="br0">)</span></span></span> 中所有 <code>i</code> ,以 <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">get</span><span class="sy1"><</span>i<span class="sy1">></span><span class="br0">(</span>other<span class="br0">)</span></span></span> 初始化 tuple 的第 i 个元素。
|
||||
<ul>
|
||||
<li>此重载仅若
|
||||
<ul>
|
||||
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>Types<span class="br0">)</span> <span class="sy1">==</span> sizeof...<span class="br0">(</span>UTypes<span class="br0">)</span></span></span> 且</li>
|
||||
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_constructible.html"><span class="kw521">std::<span class="me2">is_constructible_v</span></span></a><span class="sy1"><</span>Ti, <span class="kw4">const</span> Ui<span class="sy3">&</span><span class="sy1">></span></span></span> 对所有 <code>i</code> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 且</li>
|
||||
<li>以下之一成立
|
||||
<ul>
|
||||
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>Types<span class="br0">)</span> <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">1</span></span></span> 或</li>
|
||||
<li>( <code>Types...</code> 展开成 <code>T</code> 且 <code>UTypes...</code> 展开成 <code>U</code> 时) <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_convertible.html"><span class="kw593">std::<span class="me2">is_convertible_v</span></span></a><span class="sy1"><</span><span class="kw4">const</span> tuple<span class="sy1"><</span>U<span class="sy1">></span><span class="sy3">&</span>, T<span class="sy1">></span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_constructible.html"><span class="kw521">std::<span class="me2">is_constructible_v</span></span></a><span class="sy1"><</span>T, <span class="kw4">const</span> tuple<span class="sy1"><</span>U<span class="sy1">></span><span class="sy3">&</span><span class="sy1">></span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_same.html"><span class="kw589">std::<span class="me2">is_same_v</span></span></a><span class="sy1"><</span>T, U<span class="sy1">></span></span></span> 均为 <code>false</code> 才参与重载决议。</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>构造函数若且唯若 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_convertible.html"><span class="kw592">std::<span class="me2">is_convertible</span></span></a><span class="sy1"><</span><span class="kw4">const</span> Ui<span class="sy3">&</span>, Ti<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 对至少一个 <code>i</code> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> 才为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">explicit</span></span></span> 。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="t-li1"><span class="t-li">5)</span> 转换移动构造函数。对 <span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>UTypes<span class="br0">)</span></span></span> 中所有 <code>i</code> ,以 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-forward.html"><span class="kw1117">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>Ui<span class="sy1">></span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">get</span><span class="sy1"><</span>i<span class="sy1">></span><span class="br0">(</span>other<span class="br0">)</span><span class="br0">)</span></span></span> 初始化 tuple 的第 i 个元素。
|
||||
<ul>
|
||||
<li>此重载仅若
|
||||
<ul>
|
||||
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>Types<span class="br0">)</span> <span class="sy1">==</span> sizeof...<span class="br0">(</span>UTypes<span class="br0">)</span></span></span> 且</li>
|
||||
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_constructible.html"><span class="kw521">std::<span class="me2">is_constructible_v</span></span></a><span class="sy1"><</span>Ti, Ui<span class="sy3">&&</span><span class="sy1">></span></span></span> 对所有 <code>i</code> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 且</li>
|
||||
<li>以下之一成立
|
||||
<ul>
|
||||
<li><span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>Types<span class="br0">)</span> <span class="sy3">!</span><span class="sy1">=</span> <span class="nu0">1</span></span></span> 或</li>
|
||||
<li>( <code>Types...</code> 展开成 <code>T</code> 且 <code>UTypes...</code> 展开成 <code>U</code> 时) <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_convertible.html"><span class="kw593">std::<span class="me2">is_convertible_v</span></span></a><span class="sy1"><</span>tuple<span class="sy1"><</span>U<span class="sy1">></span>, T<span class="sy1">></span></span></span> 、 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_constructible.html"><span class="kw521">std::<span class="me2">is_constructible_v</span></span></a><span class="sy1"><</span>T, tuple<span class="sy1"><</span>U<span class="sy1">>></span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_same.html"><span class="kw589">std::<span class="me2">is_same_v</span></span></a><span class="sy1"><</span>T, U<span class="sy1">></span></span></span> 均为 <code>false</code> 才参与重载决议。</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li>构造函数若且唯若 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_convertible.html"><span class="kw592">std::<span class="me2">is_convertible</span></span></a><span class="sy1"><</span>Ui<span class="sy3">&&</span>, Ti<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 对至少一个 <code>i</code> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> 才为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">explicit</span></span></span> 。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="t-li1"><span class="t-li">6)</span> pair 复制构造函数。构造 2-tuple ,从 <code>p.first</code> 构造第一个元素,从 <code>p.second</code> 构造第二个元素。
|
||||
<ul>
|
||||
<li>此重载仅若 <span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>Types<span class="br0">)</span> <span class="sy1">==</span> <span class="nu0">2</span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_constructible.html"><span class="kw520">std::<span class="me2">is_constructible</span></span></a><span class="sy1"><</span>T0,<span class="kw4">const</span> U1<span class="sy3">&</span><span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_constructible.html"><span class="kw520">std::<span class="me2">is_constructible</span></span></a><span class="sy1"><</span>T1, <span class="kw4">const</span> U2<span class="sy3">&</span><span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 均为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 才参与重载决议。</li>
|
||||
<li>构造函数若且唯若 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_convertible.html"><span class="kw592">std::<span class="me2">is_convertible</span></span></a><span class="sy1"><</span><span class="kw4">const</span> U1<span class="sy3">&</span>, T0<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_convertible.html"><span class="kw592">std::<span class="me2">is_convertible</span></span></a><span class="sy1"><</span><span class="kw4">const</span> U2<span class="sy3">&</span>, T1<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> 才为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">explicit</span></span></span> 。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="t-li1"><span class="t-li">7)</span> pair 移动构造函数。构造 2-tuple ,从 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-forward.html"><span class="kw1117">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>U1<span class="sy1">></span><span class="br0">(</span>p.<span class="me1">first</span><span class="br0">)</span></span></span> 构造第一个元素,从 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-forward.html"><span class="kw1117">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>U2<span class="sy1">></span><span class="br0">(</span>p.<span class="me1">second</span><span class="br0">)</span></span></span> 构造第二个元素。
|
||||
<ul>
|
||||
<li>此重载仅若 <span class="t-c"><span class="mw-geshi cpp source-cpp">sizeof...<span class="br0">(</span>Types<span class="br0">)</span> <span class="sy1">==</span> <span class="nu0">2</span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_constructible.html"><span class="kw520">std::<span class="me2">is_constructible</span></span></a><span class="sy1"><</span>T0, U1<span class="sy3">&&</span><span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 与 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_constructible.html"><span class="kw520">std::<span class="me2">is_constructible</span></span></a><span class="sy1"><</span>T1, U2<span class="sy3">&&</span><span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 均为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 才参与重载决议。</li>
|
||||
<li>构造函数若且唯若 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_convertible.html"><span class="kw592">std::<span class="me2">is_convertible</span></span></a><span class="sy1"><</span>U1<span class="sy3">&&</span>, T0<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 或 <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">convertible</span><span class="sy1"><</span>U2<span class="sy3">&&</span>, T1<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">false</span></span></span> 才为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">explicit</span></span></span> 。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="t-li1"><span class="t-li">8)</span> 隐式定义的复制构造函数。以 <code>other</code> 的对应元素初始化 tuple 的每个元素。
|
||||
<ul>
|
||||
<li>若此函数进行的每个操作都是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">constexpr</span></span></span> ,则它是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">constexpr</span></span></span> 。对于空 tuple <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a><span class="sy1"><></span></span></span> ,它是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">constexpr</span></span></span> 。</li>
|
||||
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_copy_constructible.html"><span class="kw532">std::<span class="me2">is_copy_constructible</span></span></a><span class="sy1"><</span>Ti<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 必须对所有 <code>i</code> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> ,否则<span class="t-rev-inl t-until-cxx20"><span>行为未定义</span> <span><span class="t-mark-rev t-until-cxx20">(C++20 前)</span></span></span><span class="t-rev-inl t-since-cxx20"><span>程序为谬构</span> <span><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></span></span>。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="t-li1"><span class="t-li">9)</span> 隐式定义的移动构造函数。以 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-forward.html"><span class="kw1117">std::<span class="me2">forward</span></span></a><span class="sy1"><</span>Ui<span class="sy1">></span><span class="br0">(</span>std<span class="sy4">::</span><span class="me2">get</span><span class="sy1"><</span>i<span class="sy1">></span><span class="br0">(</span>other<span class="br0">)</span><span class="br0">)</span></span></span> 构造 tuple 的第 i 个元素。</div>
|
||||
<div class="t-li1"><span class="t-li"></span> 若此函数进行的每个操作都是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">constexpr</span></span></span> ,则它是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">constexpr</span></span></span> 。对于空 tuple <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a><span class="sy1"><></span></span></span> ,它是 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">constexpr</span></span></span> 。
|
||||
<ul>
|
||||
<li><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-types-is_move_constructible.html"><span class="kw538">std::<span class="me2">is_move_constructible</span></span></a><span class="sy1"><</span>Ti<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 必须对所有 <code>i</code> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> ,否则<span class="t-rev-inl t-until-cxx20"><span>行为未定义</span> <span><span class="t-mark-rev t-until-cxx20">(C++20 前)</span></span></span><span class="t-rev-inl t-since-cxx20"><span>此重载不参与重载决议</span> <span><span class="t-mark-rev t-since-cxx20">(C++20 起)</span></span></span>。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="t-li1"><span class="t-li">10-18)</span> 等同于 <span class="t-v">(1-9)</span> ,除了以<i><a href="cpp-memory-uses_allocator.html#.E4.BD.BF.E7.94.A8.E5.88.86.E9.85.8D.E5.99.A8.E6.9E.84.E9.80.A0">使用分配器构造</a></i>创建每个元素每个元素,即以分配器对象 <code>a</code> 为额外参数传递给每个 <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-memory-uses_allocator.html"><span class="kw704">std::<span class="me2">uses_allocator</span></span></a><span class="sy1"><</span>Ui, Alloc<span class="sy1">></span><span class="sy4">::</span><span class="me2">value</span></span></span> 为 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> 的对象的构造函数。</div>
|
||||
<h3><span class="mw-headline" id=".E5.8F.82.E6.95.B0">参数</span></h3>
|
||||
<table class="t-par-begin">
|
||||
<tr class="t-par">
|
||||
<td>args</td>
|
||||
<td>-</td>
|
||||
<td>用于初始化 <code>tuple</code> 每个元素的值</td>
|
||||
</tr>
|
||||
<tr class="t-par">
|
||||
<td>other</td>
|
||||
<td>-</td>
|
||||
<td>用于初始化 <code>tuple</code> 每个元素的值的 <code>tuple</code></td>
|
||||
</tr>
|
||||
<tr class="t-par">
|
||||
<td>p</td>
|
||||
<td>-</td>
|
||||
<td>用于初始化此 2-tuple 的两个元素的值的 <code>pair</code></td>
|
||||
</tr>
|
||||
<tr class="t-par">
|
||||
<td>a</td>
|
||||
<td>-</td>
|
||||
<td>用于使用分配器构造的分配器</td>
|
||||
</tr>
|
||||
</table>
|
||||
<h3><span class="mw-headline" id=".E6.B3.A8.E8.A7.A3">注解</span></h3>
|
||||
<p>条件性 explicit 的构造函数使得可以用列表初始化语法于复制初始化语境构造 tuple :</p>
|
||||
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
||||
<div class="cpp source-cpp">
|
||||
<pre class="de1"><a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a><span class="sy1"><</span><span class="kw4">int</span>, <span class="kw4">int</span><span class="sy1">></span> foo_tuple<span class="br0">(</span><span class="br0">)</span>
|
||||
<span class="br0">{</span>
|
||||
<span class="kw1">return</span> <span class="br0">{</span><span class="nu0">1</span>, <span class="sy2">-</span><span class="nu0">1</span><span class="br0">}</span><span class="sy4">;</span> <span class="co1">// N4387 前错误</span>
|
||||
<span class="kw1">return</span> <a href="cpp-utility-tuple-make_tuple.html"><span class="kw1112">std::<span class="me2">make_tuple</span></span></a><span class="br0">(</span><span class="nu0">1</span>, <span class="sy2">-</span><span class="nu0">1</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 始终工作</span>
|
||||
<span class="br0">}</span></pre></div>
|
||||
</div>
|
||||
<p>注意若列表中某元素不可隐式转换成目标 tuple 中的对应元素,则构造函数变为 explicit 。</p>
|
||||
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
||||
<div class="cpp source-cpp">
|
||||
<pre class="de1"><span class="kw1">using</span> <span class="kw1">namespace</span> std<span class="sy4">::</span><span class="me2">chrono</span><span class="sy4">;</span>
|
||||
<span class="kw4">void</span> launch_rocket_at<span class="br0">(</span><a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a><span class="sy1"><</span>hours, minutes, seconds<span class="sy1">></span><span class="br0">)</span><span class="sy4">;</span>
|
||||
|
||||
launch_rocket_at<span class="br0">(</span><span class="br0">{</span>hours<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span>, minutes<span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span>, seconds<span class="br0">(</span><span class="nu0">3</span><span class="br0">)</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK</span>
|
||||
launch_rocket_at<span class="br0">(</span><span class="br0">{</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// 错误: int 不可隐式转换成 duration</span>
|
||||
launch_rocket_at<span class="br0">(</span><a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a><span class="sy1"><</span>hours, minutes, seconds<span class="sy1">></span><span class="br0">{</span><span class="nu0">1</span>, <span class="nu0">2</span>, <span class="nu0">3</span><span class="br0">}</span><span class="br0">)</span><span class="sy4">;</span> <span class="co1">// OK</span></pre></div>
|
||||
</div>
|
||||
<h3><span class="mw-headline" id=".E7.A4.BA.E4.BE.8B">示例</span></h3>
|
||||
<div class="t-example">
|
||||
<div class="t-example-live-link"></div>
|
||||
<div dir="ltr" class="mw-geshi" style="text-align: left;">
|
||||
<div class="cpp source-cpp">
|
||||
<pre class="de1"><span class="co2">#include <iostream></span>
|
||||
<span class="co2">#include <string></span>
|
||||
<span class="co2">#include <vector></span>
|
||||
<span class="co2">#include <tuple></span>
|
||||
<span class="co2">#include <memory></span>
|
||||
|
||||
<span class="co1">// 打印任何大小 tuple 的辅助函数</span>
|
||||
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span> Tuple, <a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a> N<span class="sy1">></span>
|
||||
<span class="kw1">struct</span> TuplePrinter <span class="br0">{</span>
|
||||
<span class="kw4">static</span> <span class="kw4">void</span> print<span class="br0">(</span><span class="kw4">const</span> Tuple<span class="sy3">&</span> t<span class="br0">)</span>
|
||||
<span class="br0">{</span>
|
||||
TuplePrinter<span class="sy1"><</span>Tuple, N<span class="sy2">-</span><span class="nu0">1</span><span class="sy1">></span><span class="sy4">::</span><span class="me2">print</span><span class="br0">(</span>t<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">", "</span> <span class="sy1"><<</span> std<span class="sy4">::</span><span class="me2">get</span><span class="sy1"><</span>N<span class="sy2">-</span><span class="nu0">1</span><span class="sy1">></span><span class="br0">(</span>t<span class="br0">)</span><span class="sy4">;</span>
|
||||
<span class="br0">}</span>
|
||||
<span class="br0">}</span><span class="sy4">;</span>
|
||||
|
||||
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span> Tuple<span class="sy1">></span>
|
||||
<span class="kw1">struct</span> TuplePrinter<span class="sy1"><</span>Tuple, <span class="nu0">1</span><span class="sy1">></span><span class="br0">{</span>
|
||||
<span class="kw4">static</span> <span class="kw4">void</span> print<span class="br0">(</span><span class="kw4">const</span> Tuple<span class="sy3">&</span> t<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> std<span class="sy4">::</span><span class="me2">get</span><span class="sy1"><</span><span class="nu0">0</span><span class="sy1">></span><span class="br0">(</span>t<span class="br0">)</span><span class="sy4">;</span>
|
||||
<span class="br0">}</span>
|
||||
<span class="br0">}</span><span class="sy4">;</span>
|
||||
|
||||
<span class="kw1">template</span><span class="sy1"><</span><span class="kw1">class</span>... <span class="me1">Args</span><span class="sy1">></span>
|
||||
<span class="kw4">void</span> print<span class="br0">(</span><span class="kw4">const</span> <a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a><span class="sy1"><</span>Args...<span class="sy1">></span><span class="sy3">&</span> t<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> <span class="st0">"("</span><span class="sy4">;</span>
|
||||
TuplePrinter<span class="sy1"><</span>decltype<span class="br0">(</span>t<span class="br0">)</span>, sizeof...<span class="br0">(</span>Args<span class="br0">)</span><span class="sy1">></span><span class="sy4">::</span><span class="me2">print</span><span class="br0">(</span>t<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">")<span class="es1">\n</span>"</span><span class="sy4">;</span>
|
||||
<span class="br0">}</span>
|
||||
<span class="co1">// 辅助函数结束</span>
|
||||
|
||||
<span class="kw4">int</span> main<span class="br0">(</span><span class="br0">)</span>
|
||||
<span class="br0">{</span>
|
||||
<a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a><span class="sy1"><</span><span class="kw4">int</span>, <a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a>, <span class="kw4">double</span><span class="sy1">></span> t1<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">"Value-initialized: "</span><span class="sy4">;</span> print<span class="br0">(</span>t1<span class="br0">)</span><span class="sy4">;</span>
|
||||
<a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a><span class="sy1"><</span><span class="kw4">int</span>, <a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a>, <span class="kw4">double</span><span class="sy1">></span> t2<span class="br0">(</span><span class="nu0">42</span>, <span class="st0">"Test"</span>, <span class="sy2">-</span><span class="nu16">3.14</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">"Initialized with values: "</span><span class="sy4">;</span> print<span class="br0">(</span>t2<span class="br0">)</span><span class="sy4">;</span>
|
||||
<a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a><span class="sy1"><</span><span class="kw4">char</span>, <a href="cpp-string-basic_string.html"><span class="kw1230">std::<span class="me2">string</span></span></a>, <span class="kw4">int</span><span class="sy1">></span> t3<span class="br0">(</span>t2<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">"Implicitly converted: "</span><span class="sy4">;</span> print<span class="br0">(</span>t3<span class="br0">)</span><span class="sy4">;</span>
|
||||
<a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a><span class="sy1"><</span><span class="kw4">int</span>, <span class="kw4">double</span><span class="sy1">></span> t4<span class="br0">(</span><a href="cpp-utility-pair-make_pair.html"><span class="kw1097">std::<span class="me2">make_pair</span></span></a><span class="br0">(</span><span class="nu0">42</span>, <span class="nu16">3.14</span><span class="br0">)</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">"Constructed from a pair"</span><span class="sy4">;</span> print<span class="br0">(</span>t4<span class="br0">)</span><span class="sy4">;</span>
|
||||
|
||||
<span class="co1">// 给出分配器 (Allocator) my_alloc ,带单参数构造函数 my_alloc(int)</span>
|
||||
<span class="co1">// 用 my_alloc(1) 于 vector 中分配 10 个 int</span>
|
||||
<a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1"><</span><span class="kw4">int</span>, my_alloc<span class="sy1">></span> v<span class="br0">(</span><span class="nu0">10</span>, <span class="nu0">1</span>, my_alloc<span class="br0">(</span><span class="nu0">1</span><span class="br0">)</span><span class="br0">)</span><span class="sy4">;</span>
|
||||
<span class="co1">// 用 my_alloc(2) 于 tuple 中的 vector 分配 10 个 int</span>
|
||||
<a href="cpp-utility-tuple.html"><span class="kw1098">std::<span class="me2">tuple</span></span></a><span class="sy1"><</span><span class="kw4">int</span>, <a href="cpp-container-vector.html"><span class="kw1269">std::<span class="me2">vector</span></span></a><span class="sy1"><</span><span class="kw4">int</span>, my_alloc<span class="sy1">></span>, <span class="kw4">double</span><span class="sy1">></span> t5<span class="br0">(</span><a href="cpp-memory-allocator_arg.html"><span class="kw703">std::<span class="me2">allocator_arg</span></span></a>,
|
||||
my_alloc<span class="br0">(</span><span class="nu0">2</span><span class="br0">)</span>, <span class="nu0">42</span>, v, <span class="sy2">-</span><span class="nu16">3.14</span><span class="br0">)</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">Value-initialized: (0, , 0)
|
||||
Initialized with values: (42, Test, -3.14)
|
||||
Implicitly converted: (*, Test, -3)
|
||||
Constructed from a pair(42, 3.14)</pre></div>
|
||||
</div>
|
||||
</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://wg21.link/N4387">N4387</a></td>
|
||||
<td>C++11</td>
|
||||
<td>某些构造函数曾为 explicit ,阻止了有用的行为</td>
|
||||
<td>使大多数构造函数为条件性 explicit</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue2510">LWG 2510</a></td>
|
||||
<td>C++11</td>
|
||||
<td>默认构造函数为隐式</td>
|
||||
<td>使之为条件性 explicit</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue3158">LWG 3158</a></td>
|
||||
<td>C++11</td>
|
||||
<td>对应默认构造函数的使用分配器构造函数为隐式</td>
|
||||
<td>使之为条件性 explicit</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue3211">LWG 3211</a></td>
|
||||
<td>C++11</td>
|
||||
<td>未指定 <code>tuple<></code> 的默认构造函数是否为平凡</td>
|
||||
<td>要求为平凡</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-utility-tuple-make_tuple.html"><span class="t-lines"><span>make_tuple</span></span></a></div>
|
||||
</div>
|
||||
</td>
|
||||
<td>创建一个 <code>tuple</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-tuple-tie.html"><span class="t-lines"><span>tie</span></span></a></div>
|
||||
</div>
|
||||
</td>
|
||||
<td>创建左值引用的 <code>tuple</code>,或将 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-tuple-forward_as_tuple.html"><span class="t-lines"><span>forward_as_tuple</span></span></a></div>
|
||||
</div>
|
||||
</td>
|
||||
<td>创建<a href="cpp-language-reference.html#.E8.BD.AC.E5.8F.91.E5.BC.95.E7.94.A8">转发引用</a>的 <code>tuple</code><br />
|
||||
<span class="t-mark">(函数模板)</span></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<div class="visualClear"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user