为什么 std::is_error_code_enum<std::errc>::value 是假的?

Why is std::is_error_code_enum<std::errc>::value false?

std::is_error_code_enum描述为:

If T is an error code enumeration, this template provides the member constant value equal true.

std::errc描述为:

The scoped enumeration std::errc defines the values of portable error conditions

那么,std::is_error_code_enum<std::errc>::value应该是true吧?然而对我来说,这是错误的。这是故意的吗?


这很重要,因为没有它,从 std::errcstd::error_code 的隐式转换不存在。

[system_error.syn]/1:

The is_­error_­code_­enum and is_­error_­condition_­enum may be specialized for program-defined types to indicate that such types are eligible for class error_­code and class error_­condition automatic conversions, respectively.

is_error_condition_enum<>::value 值为 true for std::errc:

template<> struct is_error_condition_enum<errc> : true_type {};

std::errc 是错误 条件 的枚举。也就是说

std::is_error_condition_enum<T>::value;

将是 true。因为它不是错误 codes

的枚举
std::is_error_code_enum<T>::value;

应该是,现在也是,false

为了启用 std::errc 中的 std::error_code 构造函数和赋值运算符,我们需要明确说明 std::is_error_code_enum<std::errc> 应该 return 为真。否则构造函数和赋值运算符将被禁用。

#include <iostream>
#include <system_error>

// Enable error_code(errc) and error_code = errc
template <> struct std::is_error_code_enum<std::errc>
    : std::true_type {};

int main() {
    std::error_code inv_arg1(std::errc::invalid_argument);
    std::error_code inv_arg2;
    inv_arg2 = std::errc::invalid_argument;
    std::cout << inv_arg1 << std::endl;
    std::cout << inv_arg2 << std::endl;
    return 0;
}

更多详情system_error header