Существует ли вероятность того, что вызов std :: generic_category () изменится на errno? - PullRequest
0 голосов
/ 27 мая 2019

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;
}

Но если выполняются два условия, этот код не работает должным образом:

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

...