- exception[meta header]
- std[meta namespace]
- type-alias[meta id-type]
- cpp11[meta cpp]
namespace std {
using exception_ptr = unspecified;
}
- unspecified[italic]
例外オブジェクトを指すポインタ。
exception_ptr
の具体的な型は未規定だが、ヌル値を格納可能で、あらゆる例外型のオブジェクトを指すことが可能なポインタである。
そのデフォルトコンストラクタはヌル値を指すよう初期化する。
この型は通常のポインタと違い、算術型、列挙型、ポインタ型への暗黙変換はできない。
exception_ptr
は通常、参照カウントスマートポインタとして実装されるだろう。
exception_ptr
の主な用途は、バックグランドスレッドからメインスレッドに、例外オブジェクトを持ち運ぶ、というものである。標準ライブラリにおいては、promise
とfuture
の実装で使用される。
#include <iostream>
#include <exception>
#include <stdexcept>
int main()
{
std::exception_ptr ep1;
// nullptrと比較可能
if (ep1 == nullptr) {
std::cout << "1. null" << std::endl;
}
// bool値に暗黙変換可能
if (!ep1) {
std::cout << "2. null" << std::endl;
}
// デフォルトコンストラクトしたexception_ptrはヌル値
if (ep1 == std::exception_ptr()) {
std::cout << "3. null" << std::endl;
}
// 例外処理中ではないためcurrent_exceptionはヌル値を指すexception_ptrを返す
ep1 = std::current_exception();
if (!ep1) {
std::cout << "4. null" << std::endl;
}
try {
throw std::runtime_error("error!");
}
catch (...) {
// 処理中の例外を取得
ep1 = std::current_exception();
}
try {
if (ep1) {
// exception_ptrで再送出
std::rethrow_exception(ep1);
}
}
catch (std::runtime_error& e) {
std::cout << e.what() << std::endl;
}
}
- std::exception_ptr[color ff0000]
- std::current_exception()[link current_exception.md]
- std::runtime_error[link /reference/stdexcept.md]
- std::rethrow_exception[link rethrow_exception.md]
1. null
2. null
3. null
4. null
error!
- C++11
- Clang: ??
- GCC:
- GCC, C++11 mode: 4.7.0
- ICC: ??
- Visual C++: 2010, 2012, 2013, 2015, 2017
- 2010では、
bool
への暗黙の変換、!=
での比較が実装されていない。上記コード例の1.と3.そしてerror
の箇所にあるif
はコンパイルエラーになる。
- 2010では、