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

时间:2018-07-26 19:21:29

标签: c++ c++11 error-code

std::is_error_code_enum被描述为:

  

如果T是错误代码枚举,则此模板将提供等于true的成员常量值。

std::errc被描述为:

  

作用域枚举std :: errc定义了可移植错误条件的值

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


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

3 个答案:

答案 0 :(得分:1)

[system_error.syn]/1

  

is_­error_­code_­枚举和is_­error_­condition_­枚举可能是   专门用于程序定义的类型,以指示此类类型是   符合class error_­code和class error_­condition自动的条件   转化。

is_error_condition_enum <> :: true的值是std::errc

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

答案 1 :(得分:1)

std::errc是错误 conditions 的枚举。那是

std::is_error_condition_enum<T>::value;

将为true。由于它不是错误的枚举,所以 codes

std::is_error_code_enum<T>::value;

应该是false

答案 2 :(得分:-1)

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

#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