C++11中的枚举类实例化

4

我遇到了以下形式的枚举类变量实例化,它在VS2012下编译没有任何警告或错误:

UINT32 id;
enum class X {apple, pear, orange};
X myX = X(id);

此外,将X(id)作为参数传递给期望X类型参数的函数也可以编译。 我不确定结果是否总是正确的,或者这只是奇怪的编译器行为。
然而,尝试使用X myX(id)代替上述代码会导致编译错误:

错误C2440:“初始化”:无法从“UINT32”转换为“X”。 枚举类型需要显式转换(static_cast、C风格转换或函数风格转换)。

阅读C++11标准并没有帮助我理解。 因此,我对此主题有2个问题:
  1. 是否可能使用整数类型作为参数构造枚举类对象?
  2. 如果问题1成立,为什么X myX(id)不能工作?
1个回答

2
你并没有用那种语法构造一个枚举,而是使用了一种另类的显式转换语法,将 UINT32 转换为 enum class X。例如,可以像这样显式地将 double 转换为 int:
double p = 0.0;
int f = int(p)

请参考此Stack Overflow帖子,了解在C++中可以使用的各种类型转换语法。

您的代码也可以使用更常见的类型转换语法来编写,如下所示:

UINT32 id;
enum class X {apple, pear, orange};
X myX = (X)id;

谢谢,我之前不知道这个语法。但这引出了另一个问题:我怎么知道这样的语法会结果于类型转换还是调用 X 类的构造函数? - SomeWittyUsername
@icepack:为了调用类X的构造函数,X必须首先是一个类X是一个强类型枚举,虽然在其定义中使用了单词“class”,但它不是一个类。当您使用classname(stuff)时,您将始终调用构造函数。 - Nicol Bolas
我知道这个。我的最后一个问题更加普遍,涉及到X实际上是一个类的情况。在其他情况下,自然没有歧义。所以你的意思是这种转换语法不适用于类。 - SomeWittyUsername
2
@ildjarn,那不正确。static_cast与前两者(C样式转换)是不同的东西,假设你谈论的是非类类型。 - Johannes Schaub - litb
(谈论类类型,前两个仍然等效,但几乎不能称为“C风格”)。 - Johannes Schaub - litb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接