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
となる型のエラー値を受け取って構築する。
効果
- (1) : 値
0
(正常値)で構築する。エラーカテゴリはsystem_category()
と見なされる。 - (3) :
*this = make_error_code(e);
となる。
例外
投げない
備考
- (3) :
is_error_code_enum
がfalse
となる場合、この関数はオーバーロード解決から除外される - (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;
}
}
xxxxxxxxxx
#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;
出力
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;
}
xxxxxxxxxx
#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
出力
not found
バージョン
言語
- C++11
処理系
- Clang: ??
- GCC: 4.6.1 ✅
- ICC: ??
- Visual C++: 2010 (enum class未対応のため、ErrorCodeEnumのコンストラクタは動作しない) ✅