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