【发布时间】:2021-10-27 17:49:46
【问题描述】:
我了解std::error_code 和std::error_condition 之间的区别,并且我了解std::errc 是“错误条件”枚举而不是“错误代码”枚举。我了解如何将结果 std::error_code 值与“错误条件”等进行比较。这些年来,我多次阅读Chris Kohlhoff's blog post about these types。我已经在生产代码中使用了这些类型和它们的扩展。
但是,我不明白为什么std::make_error_code(std::errc) 存在。
似乎没有必要比较实际std::error_code 值与std::error_condition 值:有std::make_error_condition(std::errc) 和到std::error_condition 的转换以及所有这些的特殊比较重载.
函数的存在尤其令人费解,因为std::is_error_code_enum_v<std::err> 是false 对应于std::errc。大概是防止通过std::make_error_code(std::errc)将std::errc隐式转换为std::error_code,但我不清楚为什么在std::make_error_code(std::errc)时阻止这是可取的存在。换句话说,如果您不应该从std::errc 中创建std::error_code,那么为什么会有一个函数可以做到这一点?如果你应该这样做,为什么禁用隐式构造函数?
std::errc 是否是一个特殊情况,因为代码通常希望在 std::generic_category() 中实际生成一个具有 std::errc 值的真实 std::error_code?换句话说,std::errc 在某些方面 both 是“错误代码”和“错误条件”枚举吗? (如果是这样,为什么不是std::is_error_code_enum_v<std::errc> true?)
是不是因为其他原因的特殊情况?
用户定义的错误条件枚举是否也应该像 std::errc 那样提供 make_error_code(),还是只提供 make_error_condition()?
【问题讨论】:
标签: c++ error-code