error_code: como configurar e verificar errno

Estou tentando entender qual categoria devo usar ao chamar uma função C que defineerrno no Linux.

Não tenho certeza de que todos os códigos de erro possíveis sejam definidos, multados pelo POSIX, por isso estou tentado a usar osystem_category.

Mas eu gostaria de lidar com condições genéricas no meu código mais tarde, então gostaria de fazer coisas assim:

std::error_code ec;
some_func(some_path, ec);

if (ec) {
  if (ec == std::errc::file_exists) {
    // special handling
  }
  return ec;
}

Para definir o código de erro emsome_func(), Esperava continuar assim:

ec.assign(EEXIST, std::system_category());

Basicamente baseado nesta discussão:

categorias <system_error> e códigos de erro padrão / do sistemaE o exemplo de código fornecido por @ niall-douglas:
std::error_code ec;
if(-1 == open(...))
  ec = std::error_code(errno, std::system_category());
// To test using portable code
if(ec == std::errc::no_such_file_or_directory)
   ...
// To convert into nearest portable error condition (lossy, may fail)
std::error_condition ec2(ec.default_error_condition())

-https://stackoverflow.com/a/40063005/951426

No entanto, no Linux, com o GCC 6.1.1, tenho:

std::error_code(EEXIST, std::system_category()) == std::errc::file_exists retornafalsestd::error_code(EEXIST, std::generic_category()) == std::errc::file_exists retornatrue

Eu esperava que o errno + system_category fosse comparável aostd::errc condições.

Isso significa que meu código inicial que verificaif (ec == std::errc::file_exists) não funciona se eu não usar a categoria genérica.

Este é o comportamento esperado?

questionAnswers(1)

yourAnswerToTheQuestion