我遇到了以下形式的枚举类别变量实例化,并且在VS2012下没有任何警告或错误进行编译:
UINT32 id;
enum class X {apple, pear, orange};
X myX = X(id);
此外,将X(id)
作为参数发送到期望X型param的函数。我不确定结果是否始终正确或只是一种奇怪的编译器行为。
但是,尝试执行X myX(id);
而不是上述汇编错误:
错误C2440:'初始化':无法从'uint32'转换为'x'。 转换为枚举类型需要明确的铸件(static_cast,c风格铸造或功能风格的铸件)。
阅读C 11标准并没有帮助我理解。所以我有两个问题:
- 是否可以用积分类型作为参数构造枚举类对象?
- 如果1是真的,为什么
X myX(id)
不起作用?
您没有使用该语法构造枚举。相反,您正在使用替代的显式铸造语法将铸件从UINT32
到enum class X
。例如,可以明确地对这样的int施加双重:
double p = 0.0;
int f = int(p)
有关您可以在C 中使用的所有各种铸造语法请参见此堆栈溢出帖子。
您的代码可以等效地使用类似的更常见的铸造语法编写:
UINT32 id;
enum class X {apple, pear, orange};
X myX = (X)id;