Итак, в моем путешествии, чтобы понять, как std::error_code
работает, я начинаю задаваться вопросом, действительно ли нам нужно std::error_condition
а также std::error_category
, Я пытаюсь реализовать то, что в этот а также этот учебник и объем работы нетривиальный, хотя он довольно хрупкий (сейчас я пытаюсь выяснить, почему этот код вызывает связывание ошибок с дублирующимися символами).
Не проще ли подкласс std::error_code
, добавить message
имущество & метод, а затем пусть std::error_code
быть сопоставимым с перечислением, где определены коды ошибок? Я изо всех сил пытаюсь понять, почему мне нужно std::error_category
а также std::error_condition
совсем.
Основным преимуществом является то, что error_code
это копируемый тип, который можно передавать из библиотеки в библиотеку без необходимости динамического выделения памяти или шаблонов, что делает его очень легким и простым в работе.
Если вы пишете полностью автономный проект, то да, коды ошибок и категории кажутся слишком сложными, когда вы можете просто иметь свой собственный тип.
Тем не менее, ситуация меняется при написании библиотеки, предназначенной для использования другими людьми (например, ASIO, так как вы связались с сайтом think-async.com). Вы можете получить библиотеку получить error_code
экземпляра, и он сможет передать его чисто и эффективно, не зная ничего о коде, использующем библиотеку, или не заставляя каждую функцию обработки ошибок быть настроенной на тип ошибки.
В этом контексте категории ошибок важны при работе с несколькими источниками ошибок, поскольку данный код ошибки может означать две разные вещи в зависимости от источника ошибки.
Редактировать: Обратите внимание, в первой ссылке, как категории на самом деле одиночные. Это делается для обеспечения легкости, поскольку копирование указателя на объект, который гарантированно никогда не будет удален или изменен, является дешевым, безопасным для памяти и потокобезопасным.
Других решений пока нет …