Я недавно изучил P4313 R1 — предложение по стандарту, добавляющее операции битовых масок для перечислений с помощью аннотации C++26. Основная идея использует `[[=std::bitmask_type]]` для автоматической генерации битовых операторов, устраняя необходимость ручной реализации. Хотя компиляторы C++ с удовольствием вычисляют битовые операции на целых типах, критически важный момент включает целочисленное повышение. Типы, меньшие `int`, такие как `short`, повышаются до `int` перед выполнением операции. Это означает, что тип результата операций на более мелких типах по умолчанию — `int`, что требует возврата `static_cast` к исходному типу для предотвращения непреднамеренного поведения. Кроме того, `bool` представляет уникальные опасности. Булево преобразование не обрезает битовые шаблоны; вместо этого оно отображает любое ненулевое значение в `true` (целое значение 1), а ноль — в `false`. Комбинируя эти правила, обнаруживаем странность: дополнение `true` (`~true`) повышает `true` до `int` (значение 1), вычисляет результат дополнения двоичного кода как `-2`, и так как `-2` ненулевое, булево преобразование возвращает `true`. Следовательно, `static_cast(~true) == true`. Это поведение распространяется на перечисления на основе `bool`, такие как те, что определены с `[[=std::bitmask_type]]`, подчеркивая важность понимания этих неявных преобразований для надежной разработки на C++.
Источник: Hacker News · Сводку подготовил HeadlinesBriefing