cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Open Roman-Koshelev opened 2 years ago

Roman-Koshelev commented 2 years ago

Необходимо дабавить значение 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)
}
incoder1 commented 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);
}
Roman-Koshelev commented 2 years ago

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

incoder1 commented 2 years ago

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

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

apolukhin commented 1 year ago

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

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

apolukhin commented 1 year ago

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