【问题标题】:C++11 enum class instantiationC++11 枚举类实例化
【发布时间】:2012-10-09 01:54:13
【问题描述】:

我遇到过以下形式的枚举类变量实例化,它在 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 标准并没有帮助我理解。 所以我有两个关于这个问题的问题:

  1. 是否可以构造一个以整型为参数的枚举类对象?
  2. 如果 1 为真,为什么 X myX(id) 不起作用?

【问题讨论】:

    标签: c++ c++11 visual-studio-2012 construction enum-class


    【解决方案1】:

    您没有使用该语法构造枚举。相反,您正在使用另一种显式转换语法从UINT32 转换为enum class X。例如,可以像这样将 double 显式转换为 int:

    double p = 0.0;
    int f = int(p)
    

    请参阅this stack overflow post,了解您可以在 c++ 中使用的所有各种转换语法。

    您的代码可以等效地使用更常见的强制转换语法编写,如下所示:

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

    【讨论】:

    • 谢谢,我不知道这种语法。但这提出了另一个问题:我怎么知道这样的语法是否会导致强制转换或调用类 X 的构造函数?
    • @icepack:为了调用类X的构造函数,X必须首先是一个类X 是一个强类型枚举,它不是一个类(尽管在其定义中使用了 class 这个词)。当你使用classname(stuff) 时,你总会得到构造函数调用。
    • 我知道这一点。我的最后一个问题更笼统,并且与 X 实际上是一个类的情况有关。在其他情况下,自然没有歧义。所以你说的是这种转换语法不适用于类。
    • @ildjarn 这是不正确的。假设您在谈论非类类型,静态转换与前两个(c 风格转换)不同。
    • (说到类类型,前两个还是等价的,但很难称得上“c风格”)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 2013-03-13
    相关资源
    最近更新 更多