Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 整型到枚举的静态转换_C++_Casting_Enums_Static Cast - Fatal编程技术网

C++ 整型到枚举的静态转换

C++ 整型到枚举的静态转换,c++,casting,enums,static-cast,C++,Casting,Enums,Static Cast,有一个函数将枚举作为参数 void myfunc(myEnum input); 据我所知,如果我必须给这个函数一个整数,建议显式地将其强制转换为enum,原因是所有整数可能不是有效的enum值 根据 “static_cast运算符可以显式地将整数值转换为 枚举类型。如果整数类型的值不下降 在枚举值的范围内,生成的枚举 值未定义。” 和按照C++标准 5.2.9静态抛掷> 10 “整数或枚举类型的值可以显式转换 到枚举类型。如果原始值 在枚举值(7.2)的范围内。否则 结果值未指定(可能不在该

有一个函数将枚举作为参数

void myfunc(myEnum input);
据我所知,如果我必须给这个函数一个整数,建议显式地将其强制转换为enum,原因是所有整数可能不是有效的enum值

根据

“static_cast运算符可以显式地将整数值转换为 枚举类型。如果整数类型的值不下降 在枚举值的范围内,生成的枚举 值未定义。”

<>和按照C++标准<强> 5.2.9静态抛掷> 10

“整数或枚举类型的值可以显式转换 到枚举类型。如果原始值 在枚举值(7.2)的范围内。否则 结果值未指定(可能不在该范围内)。”


那么在这个场景中使用
静态\u cast
有什么意义呢?是否有一些选项会在枚举范围之外的值上引发异常(而不是为此编写显式代码)?

与往常一样,编译器只是试图阻止您自食其果。这就是为什么不能将
int
传递给需要枚举的函数。编译器会合理地抱怨,因为
int
可能与任何有效的
enum
值都不匹配

通过添加cast,您基本上会告诉编译器“闭嘴,我知道我在做什么”。这里要传达的是,您确定传入的值“在枚举值的范围内”。你最好确定是这样的,否则你就要去一个没有定义行为的地方了


如果这非常危险,那么为什么编译器不为整数值添加运行时检查?原因是,与C++一样,性能也是如此。也许你只是从周围的程序逻辑中知道int值总是有效的,你绝对不能在愚蠢的运行时检查上浪费时间。从语言设计的角度来看,这可能不是最合理的默认选择,尤其是当您的目标是编写健壮的代码时。但这只是C++的工作原理:开发者不应该为他们可能不想使用的功能付费。

因为语言需要它,因为不同于C,没有从整数到枚举类型的隐式转换。或者你在问为什么语言设计成这样?@Mike Seymour是的,我想知道为什么他们没有设置检查机制?EnUM到int是隐式的可转换的,所以如果没有检查,ONU在我身上,那么用int方式来做int。自动运行时检查是C++通常避免的,给程序员选择是否支付它们。要求一个明确的演员阵容迫使你考虑是否需要一个检查,以及让未来的读者清楚一些不寻常的事情正在发生。允许隐式转换将隐藏潜在的错误。