如果“不在枚举范围内”,为什么要将int转换为强类型枚举?

时间:2017-06-01 13:24:39

标签: c++ enums casting compiler-errors

在下面的代码中,我使用static_cast将强类型enum转换为int。这同样适用于另一个方向。但是如果演员int不在enum的范围内,它也有效。为什么这样,为什么编译器没有抓住这个?

#include <iostream>
#include <string>

enum class Name {Hans, Peter, Georg}; // 0, 1, 2

std::string getName(Name name) {
    switch(name) {
        case Name::Hans:  return "Hans";
        case Name::Peter: return "Peter";
        case Name::Georg: return "Georg";
        default: return "not valid name";
    }
}

int main()
{
    // Cast a Name to an int, works fine.
    std::cout<< static_cast<int>( Name::Peter ) <<std::endl; // 1
    std::cout<< static_cast<int>( Name::Hans ) <<std::endl;  // 0

    // Cast an int to a Name
    std::cout<< getName(static_cast<Name>(2)) <<std::endl;   // Georg
    std::cout<< getName(static_cast<Name>(3)) <<std::endl;   // not a valid name
    // I would expect a compiler error/warning like i get here:
    // std::cout<< static_cast<int>( Name::Hans + 4 ) <<std::endl;
}

1 个答案:

答案 0 :(得分:0)

首先,人们经常使用枚举来表示位标志:

enum class FontFlags { bright=0x1, bold=0x2, blink=0x4 };

现在他们希望这可行:

FontFlags(int(FontFlags::bold) | int(FontFlags::blink))

但当然价值是6,这是“不可能的”。