Skip to content

Commit d976ae7

Browse files
author
cpprefjp-autoupdate
committed
update automatically
1 parent 1ac34a7 commit d976ae7

File tree

14 files changed

+6086
-10837
lines changed

14 files changed

+6086
-10837
lines changed

reference/optional/optional.html

Lines changed: 80 additions & 6 deletions
Large diffs are not rendered by default.

reference/optional/optional/and_then.html

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,8 +200,8 @@
200200

201201
<p class="text-right"><small>
202202
最終更新日時(UTC):
203-
<span itemprop="datePublished" content="2025-07-08T15:33:39">
204-
2025年07月08日 15時33分39秒
203+
<span itemprop="datePublished" content="2026-04-07T06:36:39">
204+
2026年04月07日 06時36分39秒
205205
</span>
206206
<br/>
207207
<span itemprop="author" itemscope itemtype="http://schema.org/Person">
@@ -225,15 +225,27 @@
225225
<div class="col-sm-12 content-body">
226226

227227
<div class="identifier-type">function template</div><div class="header">&lt;optional&gt;</div><h1 itemprop="name"><span class="namespace" title="namespace std">std::</span><span class="class" title="class optional">optional::</span><span class="token">and_then</span><span class="cpp cpp23" title="C++23で追加">(C++23)</span></h1>
228-
<div itemprop="articleBody"><p><div class="codehilite"><pre><span></span><code><span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">F</span><span class="o">&gt;</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">and_then</span><span class="p">(</span><span class="n">F</span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="p">;</span><span class="w"> </span><span class="c1">// (1)</span>
229-
<span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">F</span><span class="o">&gt;</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">and_then</span><span class="p">(</span><span class="n">F</span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="p">;</span><span class="w"> </span><span class="c1">// (2)</span>
230-
<span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">F</span><span class="o">&gt;</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">and_then</span><span class="p">(</span><span class="n">F</span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="k">const</span><span class="o">&amp;</span><span class="p">;</span><span class="w"> </span><span class="c1">// (3)</span>
231-
<span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">F</span><span class="o">&gt;</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">and_then</span><span class="p">(</span><span class="n">F</span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="k">const</span><span class="o">&amp;&amp;</span><span class="p">;</span><span class="w"> </span><span class="c1">// (4)</span>
228+
<div itemprop="articleBody"><p><div class="codehilite"><pre><span></span><code><span class="c1">// optional&lt;T&gt;版のオーバーロード</span>
229+
<span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">F</span><span class="o">&gt;</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">and_then</span><span class="p">(</span><span class="n">F</span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;</span><span class="p">;</span><span class="w"> </span><span class="c1">// (1) C++23</span>
230+
<span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">F</span><span class="o">&gt;</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">and_then</span><span class="p">(</span><span class="n">F</span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="p">;</span><span class="w"> </span><span class="c1">// (2) C++23</span>
231+
<span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">F</span><span class="o">&gt;</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">and_then</span><span class="p">(</span><span class="n">F</span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="k">const</span><span class="o">&amp;</span><span class="p">;</span><span class="w"> </span><span class="c1">// (3) C++23</span>
232+
<span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">F</span><span class="o">&gt;</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">and_then</span><span class="p">(</span><span class="n">F</span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="k">const</span><span class="o">&amp;&amp;</span><span class="p">;</span><span class="w"> </span><span class="c1">// (4) C++23</span>
233+
234+
<span class="c1">// optional&lt;T&amp;&gt;版のオーバーロード (C++26)</span>
235+
<span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">F</span><span class="o">&gt;</span><span class="w"> </span><span class="k">constexpr</span><span class="w"> </span><span class="k">auto</span><span class="w"> </span><span class="n">and_then</span><span class="p">(</span><span class="n">F</span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">f</span><span class="p">)</span><span class="w"> </span><span class="k">const</span><span class="p">;</span><span class="w"> </span><span class="c1">// (5) C++26</span>
232236
</code></pre></div>
233237
</p>
234238
<h2>概要</h2>
235239
<p>有効値を保持していれば、値に対して<code>f</code>を適用した結果を<code>optional</code>として返す。
236240
有効値を保持していなければ、<code><a href="../nullopt_t.html">std::nullopt</a></code>を返す。</p>
241+
<ul>
242+
<li>(1) : <code>*this</code>が非<code>const</code>左辺値の場合</li>
243+
<li>(2) : <code>*this</code>が非<code>const</code>右辺値の場合</li>
244+
<li>(3) : <code>*this</code><code>const</code>左辺値の場合</li>
245+
<li>(4) : <code>*this</code><code>const</code>右辺値の場合</li>
246+
<li>(5) : <code>optional&lt;T&amp;&gt;</code>の場合</li>
247+
</ul>
248+
<p><code>optional&lt;T&gt;</code>では (1)~(4) が定義され、<code>optional&lt;T&amp;&gt;</code>では (5) のみが定義される。</p>
237249
<p>実際には複数<a class="cpprefjp-defined-word" data-desc="同名の関数を異なる引数・テンプレート・制約などで複数定義すること。または同名の関数の集合">オーバーロード</a>が提供されるが、大まかには下記シグニチャのようにみなせる。
238250
<code>and_then</code>へは、引数リストに1個の<code>T</code>型をとり<code>std::optional&lt;Return&gt;</code>型を返す関数や関数オブジェクトを与える。</p>
239251
<p><div class="codehilite"><pre><span></span><code><span class="k">template</span><span class="w"> </span><span class="o">&lt;</span><span class="k">class</span><span class="w"> </span><span class="nc">T</span><span class="o">&gt;</span>
@@ -248,6 +260,7 @@ <h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成
248260
<ul>
249261
<li>(1), (3) : <code><a href="../../type_traits/invoke_result.html">invoke_result_t</a>&lt;F, decltype(<a href="value.html">value()</a>)&gt;</code></li>
250262
<li>(2), (4) : <code><a href="../../type_traits/invoke_result.html">invoke_result_t</a>&lt;F, decltype(<a href="../../utility/move.html">std::move</a>(<a href="value.html">value()</a>))&gt;</code></li>
263+
<li>(5) : <code><a href="../../type_traits/invoke_result.html">invoke_result_t</a>&lt;F, decltype(*val)&gt;</code> (説明専用メンバ<code>val</code><code>T*</code>型)</li>
251264
</ul>
252265
<p><code><a href="../../type_traits/remove_cvref.html">remove_cvref_t</a>&lt;U&gt;</code><code>optional</code>の特殊化であること</p>
253266
<h2>効果</h2>
@@ -272,6 +285,16 @@ <h2>効果</h2>
272285
</code></pre></div>
273286
</p>
274287
</li>
288+
<li>
289+
<p>(5) : 次と等価</p>
290+
<p><div class="codehilite"><pre><span></span><code><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
291+
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n"><a href="../../functional/invoke.html">invoke</a></span><span class="p">(</span><span class="n"><a href="../../utility/forward.html">std::forward</a></span><span class="o">&lt;</span><span class="n">F</span><span class="o">&gt;</span><span class="p">(</span><span class="n">f</span><span class="p">),</span><span class="w"> </span><span class="o">*</span><span class="n">val</span><span class="p">);</span>
292+
<span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
293+
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n"><a href="../../type_traits/remove_cvref.html">remove_cvref_t</a></span><span class="o">&lt;</span><span class="n">U</span><span class="o">&gt;</span><span class="p">();</span>
294+
<span class="p">}</span>
295+
</code></pre></div>
296+
</p>
297+
</li>
275298
</ul>
276299
<h2>備考</h2>
277300
<p><code>and_then</code>は、メソッドチェーンをサポートするモナド風(monadic)操作として導入された。
@@ -325,6 +348,10 @@ <h2>関連項目</h2>
325348
<h2>参照</h2>
326349
<ul>
327350
<li><a href="https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0798r8.html" target="_blank">P0798R8 Monadic operations for std::optional</a></li>
351+
<li><a href="https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2988r12.pdf" target="_blank">P2988R12 <code>std::optional&lt;T&amp;&gt;</code></a><ul>
352+
<li>C++26で参照型<code>T&amp;</code>に対する部分特殊化を追加</li>
353+
</ul>
354+
</li>
328355
</ul></div>
329356

330357
</div>

0 commit comments

Comments
 (0)