std::system_error
和std::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;
}
但是,如果满足两个条件,则此代码将无法正常工作:
std::generic_category()
在errno
之前进行评估。std::generic_category()
更改errno
的值。我知道1.也许是正确的(评估顺序未指定)。
2。怎么样?标准是否保证errno
不变?我应该写const int tmp = errno; throw std::system_error(tmp, std::generic_category());
吗?