Всегда ли эквивалентны std :: error_code и std :: error_condition из одного значения и одной категории? - PullRequest
2 голосов
/ 08 апреля 2019

Я знаю, что 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 Ответ

1 голос
/ 08 апреля 2019

Это не так. Равенство кодов ошибок и условий определяется функцией-членом категории «эквивалент», и вы можете написать категорию, которая никогда не делает какие-либо коды и условия равными. Например:

#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), а так как поведение по умолчанию заключается в рассмотрении кодов и условий с одинаковой категорией и значением равными они будут сравниваться равными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...