• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    function
    <system_error>

    std::error_code::コンストラクタ

    error_code() noexcept;                                   // (1)
    
    error_code(int val, const error_category& cat) noexcept; // (2)
    
    template <class ErrorCodeEnum>
    error_code(ErrorCodeEnum e) noexcept;                    // (3)
    

    error_codeオブジェクトの構築

    • (1) : デフォルトコンストラクタ。
    • (2) : エラー値とエラーカテゴリを受け取って構築する。
    • (3) : is_error_code_enum<ErrorCodeEnum>::value == trueとなる型のエラー値を受け取って構築する。

    効果

    例外

    投げない

    備考

    • (3) : is_error_code_enumfalseとなる場合、この関数はオーバーロード解決から除外される
    • (3) : make_error_code()の呼び出しにstd::名前空間がついていないことにより、指定されたErrorCodeEnum型が定義されている名前空間のmake_error_code()関数がADLによって探索される

    基本的な使い方

    #include <iostream>
    #include <system_error>
    
    namespace std {
      // template <class ErrorCodeEnum>
      // error_code(ErrorCodeEnum e) noexcept
      // にerrcを渡せるようにするための特殊化
      template <>
      struct is_error_code_enum<std::errc> : std::true_type {};
    }
    
    int main()
    {
      // デフォルトコンストラクタ
      std::cout << "default ctor" << std::endl;
      {
        std::error_code ec;
    
        if (ec) {
          std::cout << "error" << std::endl;
        }
        else {
          std::cout << "success" << std::endl;
        }
    
        std::cout << ec.value() << std::endl;
        std::cout << ec.category().name() << std::endl;
      }
    
      // エラー値とエラーカテゴリを受け取って構築
      std::cout << std::endl << "value & category ctor" << std::endl;
      {
        std::error_code ec(static_cast<int>(std::errc::invalid_argument),
                           std::generic_category());
    
        if (ec) {
          std::cout << "error" << std::endl;
        }
        else {
          std::cout << "success" << std::endl;
        }
    
        std::cout << ec.value() << std::endl;
        std::cout << ec.category().name() << std::endl;
      }
    
      // is_error_code_enumが特殊化された型のエラー値を受け取って構築
      std::cout << std::endl << "ErrorCodeEnum ctor" << std::endl;
      {
        std::error_code ec(std::errc::invalid_argument);
    
        if (ec) {
          std::cout << "error" << std::endl;
        }
        else {
          std::cout << "success" << std::endl;
        }
    
        std::cout << ec.value() << std::endl;
        std::cout << ec.category().name() << std::endl;
      }
    }
    

    出力

    default ctor
    success
    0
    system
    
    value & category ctor
    error
    22
    generic
    
    ErrorCodeEnum ctor
    error
    22
    generic
    

    独自のエラーコードを定義する例

    #include <iostream>
    #include <system_error>
    #include <type_traits>
    
    namespace mylib {
    
    enum class my_error {
      not_found,
    };
    
    class my_error_category : public std::error_category {
    public:
      const char* name() const noexcept override
      {
        return "my_error_category";
      }
    
      std::string message(int value) const override
      {
        if (value == static_cast<int>(my_error::not_found))
          return "not found";
        return "unknown";
      }
    };
    
    const my_error_category& get_my_error_category() {
      static my_error_category cat;
      return cat;
    }
    
    std::error_code make_error_code(my_error err)
    {
      return std::error_code(static_cast<int>(err), get_my_error_category());
    }
    }
    
    namespace std {
      template <>
      struct is_error_code_enum<mylib::my_error> : public std::true_type {};
    }
    
    int main() {
      // ecにはmy_error_categoryが設定される
      std::error_code ec = mylib::my_error::not_found;
      std::cout << ec.message() << std::endl;
    }
    

    出力

    not found
    

    バージョン

    言語

    • C++11

    処理系

    • Clang: ??
    • GCC: 4.6.1
    • ICC: ??
    • Visual C++: 2010 (enum class未対応のため、ErrorCodeEnumのコンストラクタは動作しない)