从相同值和相同类别构造的std :: error_code和std :: error_condition是否始终相等?

时间:2019-04-08 17:08:57

标签: c++ c++11

我知道error_code与系统有关,而error_condition与系统无关,但这是否意味着如果我们在构造它们时指定值和类别,它们将有所不同。例如:

std::error_code ecode(1, std::system_category());

std::error_condition econd(1, std::system_category());

if (ecode == econd) // is this condition always true no matter what platform we are in??

以上情况在macOS的XCode中是正确的,所以我想知道我们是否在其他平台上是否总是这种情况?视窗。

如果是这样,为什么在ecode与系统有关而econd与系统无关的情况下发生这种情况呢?

1 个答案:

答案 0 :(得分:1)

不是。错误代码和条件的相等性由类别成员函数“等效”确定,您可以编写一个永远不会使任何代码和条件相等的类别。例如:

#include <system_error>
#include <iostream>

struct cat_type : std::error_category
{
    const char *name() const noexcept { return "name"; }
    std::string message(int) const { return "message"; }
    bool equivalent(int, const std::error_condition &) const noexcept { return false; }
    bool equivalent(const std::error_code &, int) const noexcept { return false; }
} cat;

int main() {
    std::error_code ecode(1, cat);
    std::error_condition econd(1, cat);
    std::cout << (ecode == econd) << '\n';
}

此程序打印0,因为每次调用等效项都重载,并且它们都返回false,所以它们不相等。

但是,对于std::system_category,标准特别要求equivalent函数具有默认行为(请参见N4800第18.5.2.5节syserr.errcat.objects第4段),并且由于默认行为是如果将相同类别和值的代码和条件视为相等,它们将进行比较。