6868
6969 </ head >
7070 < body >
71- < header data-kunai-mdinfo ="{"meta": {"header": ["exception"], "namespace": ["std"], "id-type": ["function"], "cpp": ["cpp26"]}, "sources": [{"id": "a8f55ec91fe094adba3fd5fb61bb98d5fbd99e0a ", "source": "#include <print>\n#include <exception>\n#include <stdexcept>\n\nint main()\n{\n std::exception_ptr ep;\n\n try {\n throw std::runtime_error(\"error!\");\n }\n catch (...) {\n std::println(\"catch\");\n ep = std::current_exception(); // \u51e6\u7406\u4e2d\u306e\u4f8b\u5916\u30dd\u30a4\u30f3\u30bf\u3092\u53d6\u5f97\n }\n\n if (const std::runtime_error* e = std::exception_ptr_cast<std::runtime_error>(ep)) {\n std::println(\"exception: {}\", e->what());\n }\n}\n"}], "page_id": ["reference", "exception", "exception_ptr_cast"]} ">
71+ < header data-kunai-mdinfo ="{"meta": {"header": ["exception"], "namespace": ["std"], "id-type": ["function"], "cpp": ["cpp26"]}, "sources": [{"id": "9401e8ecf3539ca5ae2a252f35224e4eb5582af6 ", "source": "#include <print>\n#include <exception>\n#include <stdexcept>\n\nint main()\n{\n std::exception_ptr ep;\n\n try {\n throw std::runtime_error(\"error!\");\n }\n catch (...) {\n std::println(\"catch\");\n ep = std::current_exception(); // \u51e6\u7406\u4e2d\u306e\u4f8b\u5916\u30dd\u30a4\u30f3\u30bf\u3092\u53d6\u5f97\n }\n\n if (auto e = std::exception_ptr_cast<std::runtime_error>(ep)) {\n std::println(\"exception: {}\", e->what());\n }\n}\n"}], "page_id": ["reference", "exception", "exception_ptr_cast"]} ">
7272 < nav class ="navbar navbar-default " role ="navigation ">
7373 < div class ="container-fluid ">
7474 < div class ="navbar-header ">
188188
189189 < p class ="text-right "> < small >
190190 最終更新日時(UTC):
191- < span itemprop ="datePublished " content ="2026-01-28T09:55:26 ">
192- 2026年01月28日 09時55分26秒
191+ < span itemprop ="datePublished " content ="2026-05-18T02:56:37 ">
192+ 2026年05月18日 02時56分37秒
193193 </ span >
194194 < br />
195195 < span itemprop ="author " itemscope itemtype ="http://schema.org/Person ">
215215 < div class ="identifier-type "> function</ div > < div class ="header "> <exception></ div > < h1 itemprop ="name "> < span class ="namespace " title ="namespace std "> std::</ span > < span class ="token "> exception_ptr_cast</ span > < span class ="cpp cpp26 " title ="C++26で追加 "> (C++26)</ span > </ h1 >
216216< div itemprop ="articleBody "> < p > < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="k "> namespace</ span > < span class ="w "> </ span > < span class ="nn "> std</ span > < span class ="w "> </ span > < span class ="p "> {</ span >
217217< span class ="w "> </ span > < 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 "> E</ span > < span class ="o "> ></ span >
218- < span class ="w "> </ span > < span class ="k "> constexpr</ span > < span class ="w "> </ span > < span class ="k "> const</ span > < span class ="w "> </ span > < span class ="n "> E</ span > < span class ="o "> * </ span >
218+ < span class ="w "> </ span > < span class ="k "> constexpr</ span > < span class ="w "> </ span > < span class ="n " > < a href =" ../optional/optional.html " > std::optional </ a > </ span > < span class =" o " > < </ span > < span class =" k "> const</ span > < span class ="w "> </ span > < span class ="n "> E</ span > < span class ="o "> &> </ span >
219219< span class ="w "> </ span > < span class ="n "> exception_ptr_cast</ span > < span class ="p "> (</ span > < span class ="k "> const</ span > < span class ="w "> </ span > < span class ="n "> < a href ="exception_ptr.html "> exception_ptr</ a > </ span > < span class ="o "> &</ span > < span class ="w "> </ span > < span class ="n "> p</ span > < span class ="p "> )</ span > < span class ="w "> </ span > < span class ="k "> noexcept</ span > < span class ="p "> ;</ span > < span class ="w "> </ span > < span class ="c1 "> // (1) C++26</ span >
220220
221221< span class ="w "> </ span > < 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 "> E</ span > < span class ="o "> ></ span >
@@ -228,7 +228,7 @@ <h2>概要</h2>
228228< p > < a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > ポインタを指定された< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > 型にキャストする。</ p >
229229< p > この関数は、< code > < a href ="exception_ptr.html "> std::exception_ptr</ a > </ code > オブジェクトに格納されている実際の< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > 型を取り出すために使用できる。< code > < a href ="rethrow_exception.html "> std::rethrow_exception()</ a > </ code > 関数でも同様のことはできるが、こちらの方が高速である可能性がある。</ p >
230230< ul >
231- < li > (1): < code > < a href ="exception_ptr.html "> std::exception_ptr</ a > </ code > オブジェクトを、指定された< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > 型< code > E</ code > へのポインタに変換して返す </ li >
231+ < li > (1): < code > < a href ="exception_ptr.html "> std::exception_ptr</ a > </ code > オブジェクトを、指定された< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > 型< code > E</ code > への参照を保持した < code > < a href =" ../optional/optional.html " > std::optional </ a > </ code > に変換して返す </ li >
232232< li > (2): 右辺値の< code > < a href ="exception_ptr.html "> std::exception_ptr</ a > </ code > オブジェクトを引数にするのは禁止されている</ li >
233233</ ul >
234234< h2 > < a class ="cpprefjp-defined-word " data-desc ="関数等の意味論を構成する要素の1つ。Mandates。満たさなければプログラムが不適格となる要件。この要件は、オーバーロード解決によって選択された関数内での`static_assert`の定数条件式や、関数に対するdelete宣言などで表現できる "> 適格要件</ a > </ h2 >
@@ -239,16 +239,16 @@ <h2><a class="cpprefjp-defined-word" data-desc="関数等の意味論を構成
239239< li > 型< code > E</ code > はポインタ型またはメンバポインタ型ではないこと< ul >
240240< li > 注: 型< code > E</ code > がポインタ型またはメンバポインタを許可してしまう場合、以下のような問題が起きる</ li >
241241< li > 多重継承した派生型のポインタを< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > 送出して基底クラスのポインタ型で捕捉するような場合、< code > catch</ code > 節に渡ってくるのは送出された直接のポインタ値ではなく、基底クラスがどれなのかを算出するために調整されたポインタ値となり、元の< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > 送出された値には束縛されていないという状況になる</ li >
242- < li > この関数は、元となる< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > オブジェクトそのものへのポインタを返すことを設計目的にしているため 、上記のような問題を避けるために、ポインタ型およびメンバポインタ型は許可されていない</ li >
242+ < li > この関数は、元となる< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > オブジェクトそのものへの参照を返すことを設計目的にしているため 、上記のような問題を避けるために、ポインタ型およびメンバポインタ型は許可されていない</ li >
243243</ ul >
244244</ li >
245245</ ul >
246246< h2 > < a class ="cpprefjp-defined-word " data-desc ="関数呼び出し式の評価結果となるオブジェクト・値 "> 戻り値</ a > </ h2 >
247- < p > < code > p</ code > がnullではなく、かつ型< code > const E&</ code > のハンドラがその< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > オブジェクトに対するマッチ条件を満たす場合、< code > p</ code > が指す< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > オブジェクトへのポインタを返す 。そうでない場合は、< code > nullptr </ code > を返す。</ p >
247+ < p > < code > p</ code > がnullではなく、かつ型< code > const E&</ code > のハンドラがその< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > オブジェクトに対するマッチ条件を満たす場合、< code > p</ code > が指す< a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > オブジェクトへの参照を保持した < code > < a href =" ../optional/optional.html " > std::optional </ a > </ code > を返す 。そうでない場合は、< code > < a href =" ../optional/nullopt_t.html " > std::nullopt </ a > </ code > を返す。</ p >
248248< h2 > < a class ="cpprefjp-defined-word " data-desc ="問題が発生したときに、現在実行位置を過去に通過・記録した位置に戻し、文脈情報を添えて紐づけられた処理(例外ハンドラー)を呼び出す仕組み。またはその事態 "> 例外</ a > </ h2 >
249249< p > 投げない</ p >
250250< h2 > 例</ h2 >
251- < p > < div class ="yata " id ="a8f55ec91fe094adba3fd5fb61bb98d5fbd99e0a "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include < a href ="../print.html "> <print></ a > </ span >
251+ < p > < div class ="yata " id ="9401e8ecf3539ca5ae2a252f35224e4eb5582af6 "> < div class ="codehilite "> < pre > < span > </ span > < code > < span class ="cp "> #include < a href ="../print.html "> <print></ a > </ span >
252252< span class ="cp "> #include < a href ="../exception.html "> <exception></ a > </ span >
253253< span class ="cp "> #include < a href ="../stdexcept.html "> <stdexcept></ a > </ span >
254254
@@ -264,7 +264,7 @@ <h2>例</h2>
264264< span class ="w "> </ span > < span class ="n "> ep</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="n "> < a href ="current_exception.html "> std::current_exception</ a > </ span > < span class ="p "> ();</ span > < span class ="w "> </ span > < span class ="c1 "> // 処理中の例外ポインタを取得</ span >
265265< span class ="w "> </ span > < span class ="p "> }</ span >
266266
267- < span class ="w "> </ span > < span class ="k "> if</ span > < span class ="w "> </ span > < span class ="p "> (</ span > < span class ="k "> const </ span > < span class =" w " > </ span > < span class =" n " > < a href =" ../stdexcept.html " > std::runtime_error </ a > </ span > < span class =" o " > * </ span > < span class ="w "> </ span > < span class ="n "> e</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="n "> < span style ="color:#ff0000 "> std::exception_ptr_cast</ span > </ span > < span class ="o "> <</ span > < span class ="n "> < a href ="../stdexcept.html "> std::runtime_error</ a > </ span > < span class ="o "> ></ span > < span class ="p "> (</ span > < span class ="n "> ep</ span > < span class ="p "> ))</ span > < span class ="w "> </ span > < span class ="p "> {</ span >
267+ < span class ="w "> </ span > < span class ="k "> if</ span > < span class ="w "> </ span > < span class ="p "> (</ span > < span class ="k "> auto </ span > < span class ="w "> </ span > < span class ="n "> e</ span > < span class ="w "> </ span > < span class ="o "> =</ span > < span class ="w "> </ span > < span class ="n "> < span style ="color:#ff0000 "> std::exception_ptr_cast</ span > </ span > < span class ="o "> <</ span > < span class ="n "> < a href ="../stdexcept.html "> std::runtime_error</ a > </ span > < span class ="o "> ></ span > < span class ="p "> (</ span > < span class ="n "> ep</ span > < span class ="p "> ))</ span > < span class ="w "> </ span > < span class ="p "> {</ span >
268268< span class ="w "> </ span > < span class ="n "> < a href ="../print/println.html "> std::println</ a > </ span > < span class ="p "> (</ span > < span class ="s "> "exception: {}"</ span > < span class ="p "> ,</ span > < span class ="w "> </ span > < span class ="n "> e</ span > < span class ="o "> -></ span > < span class ="n "> what</ span > < span class ="p "> ());</ span >
269269< span class ="w "> </ span > < span class ="p "> }</ span >
270270< span class ="p "> }</ span >
@@ -289,6 +289,10 @@ <h2>参照</h2>
289289< ul >
290290< li > < a href ="https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2927r3.html " target ="_blank "> P2927R3 Inspecting < code > exception_ptr</ code > </ a > </ li >
291291< li > < a href ="https://open-std.org/jtc1/sc22/wg21/docs/papers/2025/p3748r0.html " target ="_blank "> P3748R0 Inspecting < code > exception_ptr</ code > should be < code > constexpr</ code > </ a > </ li >
292+ < li > < a href ="https://open-std.org/jtc1/sc22/wg21/docs/papers/2026/p3981r2.html " target ="_blank "> P3981R2 Better return types in < code > std::inplace_vector</ code > and < code > std::exception_ptr_cast</ code > </ a > < ul >
293+ < li > < a class ="cpprefjp-defined-word " data-desc ="関数呼び出し式の評価結果となるオブジェクト・値 "> 戻り値</ a > 型を< code > const E*</ code > から< code > < a href ="../optional/optional.html "> std::optional</ a > <const E&></ code > に変更</ li >
294+ </ ul >
295+ </ li >
292296</ ul > </ div >
293297
294298 </ div >
0 commit comments