Open Roman-Koshelev opened 2 years ago
В упор не пойму зачем ? std::errc это enum для std::error_category который используеться в std::error_code. У std::error_code пере-определен оператор explicit boolean, который выдает true когда ошибка присутвует.
В итоге в примере ec == std::errc()
нужно поменять на !er
В свою очередь чтобы создать error_code с ошибкой из std::errc делаем
std::string foo(std::error_code& ec)
{
...
if( <fail expression> ) {
ec = std::make_error_code(std::errc::illegal_byte_sequence);
return std::string();
}
}
std::error_code ec;
std::string ret = foo(ec);
if(ec) {
throw std::system_error(ec);
}
При чем тут error_code? В стандартной библиотеке есть функции которые возвращают std::errc, который нужно проверить. Не смог написать имплементацию без "ec == std::errc()
"
Предполагается что там будет 0, и error_condition от std::make_error_code(ec) даст отсутствие ошибки.
Но в целом стоит отметить что дизайн 'std::to_chars' откровенно кривой как для С++, написан по сути на С, используется внутри std::to_string и зачем то доступен всем вместо функций стандартной библиотеки С.
Комитет решил не чинить это в C++23, так как проблема может быть решена разными способами.
Проблема обсуждается в https://wg21.link/P2497. @incoder1 @Roman-Koshelev посмотрите, устраивает ли вас подобное решение, и если нет - давайте закинем ваши идеи прямо в автора предложения.
https://wg21.link/P2497 приняли в C++26
Необходимо дабавить значение std::errc:success. Использовать enum class для кода возврата и считать что успех это дефолтно сконструированный enum который содержит значение не перечисленное в обьявлении помоему шизофрения. (Да и выглядит не очень)
Пример из https://en.cppreference.com/w/cpp/utility/to_chars