我们真的需要 std::error_category 和 std::error_condition 吗?

Do we really need std::error_category and std::error_condition?

因此,在了解 std::error_code 工作原理的过程中,我开始怀疑我们是否真的需要 std::error_conditionstd::error_category。我正在尝试实现 this and this 教程中的内容,工作量非常大,而且相当脆弱(我目前正试图弄清楚为什么这段代码会导致链接错误与重复符号。

继承std::error_code不是更容易吗,添加一个message 属性 & 方法然后让std::error_code 与定义错误代码的枚举相当?我很难理解为什么我需要 std::error_categorystd::error_condition

主要优点是 error_code 是一种可复制的类型,可以在不同的库之间传递,而无需涉及任何动态内存分配或模板,使其非常轻量且易于使用与.

如果您正在编写一个完全独立的项目,那么是的,当您可以拥有自己的类型时,错误代码和类别似乎过于复杂。

然而,当编写一个供其他人使用的库时,情况会发生变化(比如 ASIO,因为你 linked think-async.com)。您可以让一个库接收一个 error_code 实例,并且它将能够干净高效地传递它,而无需了解任何关于使用该库的代码,或者必须使每个错误处理函数成为以错误类型为模板。

在这种情况下,错误类别在处理多个错误源时很重要,因为给定的错误代码可能表示基于错误源的两种不同的含义。

编辑: 注意,在您的第一个 link 中,类别实际上是单例。这样做是为了维护轻量级,因为将指针复制到保证永远不会被删除或修改的对象是廉价的、内存安全和线程安全的。