调用std :: generic_category()是否有可能改变errno?

时间:2019-05-27 06:13:21

标签: c++ error-handling standards

std::system_errorstd::generic_category通常如下使用:

#include <system_error>
#include <cerrno>
#include <unistd.h>
#include <fcntl.h>

int foo(void)
{
    const int fd = ::open("/nonexistent/path/to/open", O_RDONLY);
    if (fd == -1) {
        throw std::system_error(errno, std::generic_category());
    }
    return fd;
}

但是,如果满足两个条件,则此代码将无法正常工作:

  1. std::generic_category()errno之前进行评估。
  2. std::generic_category()更改errno的值。

我知道1.也许是正确的(评估顺序未指定)。

2。怎么样?标准是否保证errno不变?我应该写const int tmp = errno; throw std::system_error(tmp, std::generic_category());吗?

0 个答案:

没有答案