ideas icon indicating copy to clipboard operation
ideas copied to clipboard

Добавить значение "успех" в errc

Open Roman-Koshelev opened this issue 4 years ago • 5 comments

Необходимо дабавить значение std::errc:success. Использовать enum class для кода возврата и считать что успех это дефолтно сконструированный enum который содержит значение не перечисленное в обьявлении помоему шизофрения. (Да и выглядит не очень)

Пример из https://en.cppreference.com/w/cpp/utility/to_chars

int main()
{
    std::array<char, 10> str;
 
    if(auto [ptr, ec] = std::to_chars(str.data(), str.data() + str.size(), 42);
       ec == std::errc())
         std::cout << std::string_view
           (str.data(), ptr);              // C++20, uses string_view(first, last)
      //   (str.data(), ptr - str.data()); // C++17, uses string_view(ptr, length)
}

Roman-Koshelev avatar Jul 19 '21 12:07 Roman-Koshelev

В упор не пойму зачем ? 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);
}

incoder1 avatar Jul 19 '21 17:07 incoder1

При чем тут error_code? В стандартной библиотеке есть функции которые возвращают std::errc, который нужно проверить. Не смог написать имплементацию без "ec == std::errc()"

Roman-Koshelev avatar Jul 20 '21 05:07 Roman-Koshelev

Предполагается что там будет 0, и error_condition от std::make_error_code(ec) даст отсутствие ошибки.

Но в целом стоит отметить что дизайн 'std::to_chars' откровенно кривой как для С++, написан по сути на С, используется внутри std::to_string и зачем то доступен всем вместо функций стандартной библиотеки С.

incoder1 avatar Jul 20 '21 17:07 incoder1

Комитет решил не чинить это в C++23, так как проблема может быть решена разными способами.

Проблема обсуждается в https://wg21.link/P2497. @incoder1 @Roman-Koshelev посмотрите, устраивает ли вас подобное решение, и если нет - давайте закинем ваши идеи прямо в автора предложения.

apolukhin avatar Feb 23 '23 16:02 apolukhin

https://wg21.link/P2497 приняли в C++26

apolukhin avatar Jun 30 '23 20:06 apolukhin