Всегда ли std::error_code и std ::error_condition создаются из одного и того же значения и одной и той же категории?

#c #c 11

#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??

вышесказанное верно для XCode в macOS, поэтому мне интересно, всегда ли это так, если мы находимся на других платформах, например Windows.

Если да, то почему это должно быть так, учитывая, что ecode зависит от системы и econd не зависит от системы?

Комментарии:

1. Я недостаточно знаком с поведением, чтобы ответить, но это , вероятно, отправная точка.

2. Я не думаю, что есть какая-либо гарантия для std::system_category , но мы знаем, что std::errc перечисления используют то же значение, что и условие ошибки, и значение ошибки в std::generic_category

Ответ №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 amp;) const noexcept { return false; }
    bool equivalent(const std::error_code amp;, 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), и поскольку поведение по умолчанию заключается в том, чтобы считать коды и условия с одинаковой категорией и значением равными, они будут сравниваться равными.