Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Хм, а в чем смысл наличия повторяющихся значений в цепочках сравнений, объединенных ||? Чтоб было более загадочно?
ЕМ>switch здесь как раз хорош тем, что будет ругаться на повторяющиеся значения, и тем наведет на мысль, что здесь что-то не так.
Смысл тут.Автор: so5team
Дата: 17.06.23
Цитата:
то возникнет ошибка компиляции на платформах, где EAGAIN == EWOULDBLOCK. Тогда как на платформах, где это разные значения, все будет нормально.
При этом тупое сравнение (errno == EAGAIN || errno == EWOULDBLOCK || ...) будет нормально компилироваться всегда.
BFE>>BFE>>constexpr auto arrErrs = std::array{EAGAIN, EWOULDBLOCK, EINTR, ENOSPC, ENOBUFS, ENOMEM};
BFE>>if ( std::ranges::contains(arrErrs, errno) )
BFE>> ...
BFE>>
ЕМ>Перед использованием подобных конструкций я бы сперва посмотрел, в какой код они компилируются. Иначе легко можно нарваться на активное использование динамической памяти.
Да ну откуда тут может взяться динамическая память?
Здравствуйте, B0FEE664, Вы писали:
BFE>Да ну откуда тут может взяться динамическая память?
Верно. Забыл, что std::array статический. Я ж сам std не пользую.
Здравствуйте, B0FEE664, Вы писали:
BFE>Кстати, есть ещё вариант C++23:
BFE>BFE>constexpr auto arrErrs = std::array{EAGAIN, EWOULDBLOCK, EINTR, ENOSPC, ENOBUFS, ENOMEM};
BFE>if ( std::ranges::contains(arrErrs, errno) )
BFE> ...
BFE>
Тут магия в том, что мы в contains передаём constexpr, и вместо вызова код будет развёрнут в сравнения, как и требуется по условиям задачи? Или я неправильно понимаю?