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());
?