我知道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
与系统无关的情况下发生这种情况呢?
答案 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段),并且由于默认行为是如果将相同类别和值的代码和条件视为相等,它们将进行比较。