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 ">
225225 < div class ="col-sm-12 content-body ">
226226
227227 < div class ="identifier-type "> function template</ div > < div class ="header "> <optional></ 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 "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> F</ span > < span class ="o "> ></ 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 "> &&</ span > < span class ="w "> </ span > < span class ="n "> f</ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="o "> &</ 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 "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> F</ span > < span class ="o "> ></ 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 "> &&</ span > < span class ="w "> </ span > < span class ="n "> f</ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="o "> &&</ 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 "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> F</ span > < span class ="o "> ></ 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 "> &&</ 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 "> &</ 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 "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> F</ span > < span class ="o "> ></ 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 "> &&</ 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 "> &&</ 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<T>版のオーバーロード</ span >
229+ < span class ="k "> template</ span > < span class ="w "> </ span > < span class ="o "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> F</ span > < span class ="o "> ></ 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 "> &&</ span > < span class ="w "> </ span > < span class ="n "> f</ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="o "> &</ 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 "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> F</ span > < span class ="o "> ></ 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 "> &&</ span > < span class ="w "> </ span > < span class ="n "> f</ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="o "> &&</ 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 "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> F</ span > < span class ="o "> ></ 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 "> &&</ 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 "> &</ 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 "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> F</ span > < span class ="o "> ></ 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 "> &&</ 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 "> &&</ span > < span class ="p "> ;</ span > < span class ="w "> </ span > < span class ="c1 "> // (4) C++23</ span >
233+
234+ < span class ="c1 "> // optional<T&>版のオーバーロード (C++26)</ span >
235+ < span class ="k "> template</ span > < span class ="w "> </ span > < span class ="o "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> F</ span > < span class ="o "> ></ 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 "> &&</ 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<T&></ code > の場合</ li >
247+ </ ul >
248+ < p > < code > optional<T></ code > では (1)~(4) が定義され、< code > optional<T&></ 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<Return></ code > 型を返す関数や関数オブジェクトを与える。</ p >
239251< p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="k "> template</ span > < span class ="w "> </ span > < span class ="o "> <</ span > < span class ="k "> class</ span > < span class ="w "> </ span > < span class ="nc "> T</ span > < span class ="o "> ></ 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 > <F, decltype(< a href ="value.html "> value()</ a > )></ code > </ li >
250262< li > (2), (4) : < code > < a href ="../../type_traits/invoke_result.html "> invoke_result_t</ a > <F, decltype(< a href ="../../utility/move.html "> std::move</ a > (< a href ="value.html "> value()</ a > ))></ code > </ li >
263+ < li > (5) : < code > < a href ="../../type_traits/invoke_result.html "> invoke_result_t</ a > <F, decltype(*val)></ code > (説明専用メンバ< code > val</ code > は< code > T*</ code > 型)</ li >
251264</ ul >
252265< p > < code > < a href ="../../type_traits/remove_cvref.html "> remove_cvref_t</ a > <U></ 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 "> <</ span > < span class ="n "> F</ span > < span class ="o "> ></ 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 "> <</ span > < span class ="n "> U</ span > < span class ="o "> ></ 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<T&></ code > </ a > < ul >
352+ < li > C++26で参照型< code > T&</ code > に対する部分特殊化を追加</ li >
353+ </ ul >
354+ </ li >
328355</ ul > </ div >
329356
330357 </ div >
0 commit comments