最終更新日時: 2025年10月21日 00時26分11秒 (JST)
Raclamusi が更新

履歴 編集

class
<system_error>

# std::error_condition(C++11)

    namespace std {
      class error_condition;
    }

## 概要

`error_condition`は、`error_code`に紐付くエラーを表現することを可能にするためのクラスである。

Visual C++ 2010、GCC 4.6.1では`generic_category()`と`system_category()`の`error_category`オブジェクトは`name()`メンバ関数を除いて同じ挙動を行い、それぞれの`default_error_condition()`メンバ関数も同じエラー値、同じカテゴリの`error_condition`を構築するため、実質`error_code`と`error_condition`は標準カテゴリでは等価な動作をする。だが、`error_category`を継承した新たなカテゴリを定義することにより、以下のようなエラーを表現することが可能となる：

- 一つのエラー値で上位Nビット、下位Nビットで異なるエラー情報を表現する
- 例： WindowsのHRESULT : 「HRESULT型とは？ - UsefullCode.net」
- システムのエラーコードを汎用のエラーコードに変換し、`error_code`にはシステムの環境依存エラー値、`error_condition`には環境依存しない汎用エラー値を格納する

## メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ | C++11
`~error_condition() = default` | デストラクタ | C++11
`operator=` | 代入演算子 | C++11
`assign` | 値の再設定 | C++11
`clear` | エラー情報をクリアする | C++11
`value` | エラー値を取得する | C++11
`category` | エラーカテゴリを取得する | C++11
`message` | エラーメッセージを取得する | C++11
`explicit operator bool` | エラーかどうかを判定する | C++11

## 非メンバ関数

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 | C++11
`operator!=` | 非等値比較 (C++20から`operator==`により使用可能) | C++11
`operator<=>` | 三方比較 | C++20
`operator<` | 左辺が右辺より小さいか判定する (C++20から`operator<=>`により使用可能) | C++11
`bool operator<=(const error_condition&, const error_condition&) noexcept;` | 左辺が右辺以下か判定する (`operator<=>`により使用可能) | C++20
`bool operator>(const error_condition&, const error_condition&) noexcept;` | 左辺が右辺より大きいか判定する (`operator<=>`により使用可能) | C++20
`bool operator>=(const error_condition&, const error_condition&) noexcept;` | 左辺が右辺以上か判定する (`operator<=>`により使用可能) | C++20
`make_error_condition` | `errc`から`error_condition`オブジェクトを生成する | C++11

## 例

    #include <iostream>
    #include <system_error>

    int main()
    {
      try {
        // 不正な引数エラー
        std::error_code ec(static_cast<int>(std::errc::invalid_argument),
                           std::generic_category());

        throw std::system_error(ec, "system error!");
      }
      catch (std::system_error& e) {
        // 例外オブジェクトからerror_codeを取得
        const std::error_code& ec = e.code();

        // error_codeからerror_conditionを取得
        const std::error_condition& cond = ec.default_error_condition();

        // エラー値とメッセージを出力
        std::cout << cond.value() << std::endl;
        std::cout << cond.message() << std::endl;
      }
    }

### 出力

    22
    Invalid argument

## バージョン

### 言語

- C++11

### 処理系

- Clang: ??
- GCC: 4.7.0 ✅
- ICC: ??
- Visual C++: 2010 ✅

## 参照