【问题标题】:Why is std::is_error_code_enum<std::errc>::value false?为什么 std::is_error_code_enum<std::errc>::value 为假?
【发布时间】:2019-01-03 21:09:18
【问题描述】:

std::is_error_code_enum被描述为:

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

std::errc被描述为:

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

那么,std::is_error_code_enum&lt;std::errc&gt;::value 应该是true 吗?然而对我来说,这是错误的。这是故意的吗?


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

【问题讨论】:

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


    【解决方案1】:

    std::errc 是错误条件的枚举。这意味着

    std::is_error_condition_enum<T>::value;
    

    将是true。因为它不是错误代码

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

    应该并且现在是false

    【讨论】:

    • 非常令人困惑,std::errc 是错误条件,而 std::io_errc 是错误代码
    • @Eric 是的,命名不是最好的。
    • 我不确定我是否喜欢这个答案。以 std::error_code 的第三个构造函数的描述为例:“从错误代码枚举 e 构造错误代码。等效于 *this = make_error_code(e)。仅当 std::is_error_code_enum&lt;ErrorCodeEnum&gt;::value == true 时,重载才参与重载决议。”这对我来说意味着std::is_error_code_enum&lt;T&gt;::value == true 表示make_error_code(T)there is a std::make_error_code(std::errc) 的存在。
    • 他们本可以将其命名为 'error_cond' 以匹配 'error_code'
    【解决方案2】:

    [system_error.syn]/1:

    is_error_code_enum 和 is_error_condition_enum 可能是 专门用于程序定义的类型以指示此类类型是 有资格获得类 error_code 和类 error_condition 自动 转化率。

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

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

    【讨论】:

      【解决方案3】:

      为了从std::errc 启用std::error_code 构造函数和赋值运算符,我们需要明确说明std::is_error_code_enum&lt;std::errc&gt; 应该返回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

      【讨论】:

      • 虽然这确实可行,但我怀疑标准“允许”使用 stdlib 类型专门化 stdlib 模板,这是一个坏主意。
      猜你喜欢
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 2013-03-20
      • 2012-01-25
      • 2017-05-11
      • 1970-01-01
      • 2022-03-27
      相关资源
      最近更新 更多