Я преобразую перечисления с незаданной областью в перечисления с ограниченной областью и наткнулся на головоломку.
Stroustroup, C++ Язык программирования, 4-е издание, Раздел 8.4.1, документирует, что enum-классы с областью видимости неявно преобразуются в целочисленные типы, и предоставляет код для операторов |
и &
в качестве примера того, как использовать static_cast
чтобы обойти это.
Не должна ли следующая инициализация с использованием оператора |
для ранее определенных значений enum
быть недопустимой?
enum class FileCopy {
PreviousHDUs = 1,
CurrentHDU = 2,
FollowingHDUs = 4,
AllHDUs = PreviousHDUs | CurrentHDU | FollowingHDUs,
CurrentHeader = 8
};
int main()
{
std::cout << static_cast<int>( FileCopy::AllHDUs) << "\n";
}
Я проверил это на Wandbox, используя clang и gcc HEAD с --pedantic-errors
, и он компилирует и возвращает ожидаемый результат, 7
. Это не сказать, что это законно, просто это, кажется, принято компиляторами.
Это явно задокументированное поведение? Мне не удалось проанализировать документацию таким образом, чтобы описать это поведение.