Std::error_code, как использовать условия ошибкиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Std::error_code, как использовать условия ошибки

Сообщение Anonymous »

В настоящее время я переписываю некоторый код и пытаюсь сделать это независимым от платформы способом.
Начиная с std::filesystem, у меня быстро возникают проблемы с std::error_code.< /p>
псевдокод:

Код: Выделить всё

namespace fs = std::filesystem;

std::error_code ec;
if(!fs::copy_file(src,
dest,
fs::copy_options::none,
ec))
{
switch(ec.default_error_condition())
{
case std::errc::file_exists:         do_something ...
case std::errc::no_space_on_device:  do_something ...
...
}
}
Мой пример выше приводит к ошибке:

"выражение переключателя типа 'std::error_condition' не является valid"

(VS2022).
Афаик, мне не следует использовать ec.value() поскольку это код возврата, специфичный для платформы (Win32 rc, POSIX errno, ...). Вместо этого происходит сопоставление этих кодов, специфичных для платформы, с абстрактным «условием». Одному и тому же условию могут соответствовать несколько конкретных кодов возврата. Пока все хорошо.
Но как мне получить и сравнить такие условия, как я пробовал в своем коммутаторе/кейсе?

Мне сложно найти документацию по работе с std::error_code< /code> ...
Обновление
Как отметили Фабио и 463035818, проблема с переключателем/регистром возникает из-за того, что std::error_condition, возвращаемый функцией ec.default_error_condition(), представляет собой класс без неявного преобразования в значения перечисления.

Код: Выделить всё

switch(ec.default_error_condition().value())
решена проблема компиляции. Но я до сих пор не уверен, правильно ли я его использую (по назначению). Я имею в виду, что default_error_condition() заставляет меня думать, что существуют альтернативные условия.
Обновление 2
cl (VS2022) работает, но clang (clang-cl), используя заголовок и библиотеки MS VS2022, отказывается компилировать:

Код: Выделить всё

error: value of type ‘std::errc’ is not implicitly convertible to ‘int’
не ожидал такой неприятности.

Подробнее здесь: https://stackoverflow.com/questions/781 ... conditions
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»