在下面的代码中,我使用static_cast
将强类型enum
转换为int
。另一方面也是如此。但是如果演员int
不在enum
的范围内,它也可以工作。为什么是这个,为什么编译器没有捕获这个?为什么强制类型枚举编译为“不在枚举范围内”的int?
#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;
}
您认为编译器应该“抓住”这个基础的基础是什么?据我所知,C++标准不需要任何诊断。 – nwp
为整数值的有效性添加检查会强加运行时开销。 – Bernard
当我取消注释最后一行'不匹配'operator +'(操作数类型是'Name'和'int')'时,得到的错误与您的关于枚举范围的问题没有任何关系。 – Kevin