Начиная с 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())
Обновление 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
Мобильная версия