为什么我必须明确地施放我指定基础类型的枚举
Why do I have to explicitly cast an enum that I have specified the underlying type for?
我最近了解到我可以在C 11中指定枚举者的基础类型。
我注意到我不能例如使用具有基础类型uint16_t
的枚举器作为uint16_t
参数的参数。请参阅以下示例:
#include <stdint.h>
enum class Apples : uint16_t
{
GRANNY_SMITH = 1
};
class AppleWatcher
{
uint16_t m_apple;
public:
AppleWatcher(const uint16_t apple) : m_apple(apple) {};
};
int main()
{
AppleWatcher(static_cast<uint16_t>(Apples::GRANNY_SMITH)); // This works
AppleWatcher(Apples::GRANNY_SMITH); // Compiler error here
return 0;
}
在这种情况下,我仍然必须明确施放基础类型才能使用它,那么此功能的目的是什么?
这是一种类型的安全功能。隐式转换在C 中有相关问题的悠久历史,请看一下Stephen DeWhurst的书" C Gotchas" - 最长的一章是转换。
回想一下,枚举不过是将恒定值绑定到可理解名称的一种方式。这样,就有一组有限的可能值集,并且通过隐式转换,您可以大大扩展域而无需发出任何通知。示例:
void f(uint16_t arg); // arg can have 65536 different values
enum class Apples : uint16_t { GRANNY_SMITH = 1 }; // one possible value
如果此编译:
f(Apples::GRANNY_SMITH);
您刚刚放弃了限制性,而无需通知。相反,
f(static_cast<uint16_t>(Apples::GRANNY_SMITH));
更清晰,更丑。演员的笨拙性告诉您:"你为什么要这么做?",回答这个问题不太容易。您创建了枚举来引用可能的值,通过输入其关联名称,对呢?
根据此文档页面:
没有范围值的隐式转换 枚举器到整体类型,尽管static_cast可以使用 获取枚举器的数字值。
因此,为了编译您的代码,您需要明确施放该值,即:
AppleWatcher(static_cast<uint16_t>(Apples::GRANNY_SMITH));
相关文章:
- 在有符号基础类型枚举的位域上溢出
- 在编译时将强类型枚举器转换为其基础类型?
- 如果 int 是"not within the enums range",为什么将 int 转换为强类型枚举会编译?
- 类型枚举的变量不是类型名称
- 强类型枚举的语法实现错误
- 枚举与强类型枚举
- 错误:T没有命名类型-用于使用强类型枚举的专门化
- 如何使用强类型枚举
- QT:将强类型枚举参数传递到插槽
- 在类定义中声明类型(枚举、结构等)会增加代码大小
- Visual Studio 11 (beta) 中的强类型枚举类
- 使用强类型枚举对类型和子类型进行建模
- 不允许将强类型枚举用作同一基础类型的参数
- 如何正确使用C++强类型枚举
- 带有强类型枚举的模板参数推导
- 是否可以在googleprotobuf中为类型(枚举或消息)定义一个别名
- C++中默认初始化的全局强类型枚举是什么
- std::is_signed不适用于强类型枚举:int
- 如何定义自定义值的类型?(枚举类型定义)
- 将强类型枚举传递给函数